c# - कई क्रियाएं मिलीं जो वेब एपी में अनुरोध से मेल खाते हैं



.net asp.net-web-api asp.net-web-api-routing (12)

मैंने पाया कि जब मेरे पास दो तरीके हैं, एक पैरामीटर रहित और एक जटिल प्रकार के साथ एक पैरामीटर के रूप में जो मुझे एक ही त्रुटि मिलती है। मैंने अपने जटिल पैरामीटर के बाद, मेरे पहले पैरामीटर के रूप में आईडी नामक आईडी के एक डमी पैरामीटर को जोड़कर हल किया। मैंने फिर रूट टेम्पलेट में जटिल प्रकार पैरामीटर जोड़ा। निम्नलिखित मेरे लिए काम किया।

पहले मिलता है:

public IEnumerable<SearchItem> Get()
{
...
}

दूसरा मिलता है:

public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}

WebApiConfig:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{layers}",
    defaults: new { id = RouteParameter.Optional, layers RouteParameter.Optional }
);

जब मैं 2 "प्राप्त करें" विधियों का प्रयास करता हूं तो मुझे यह त्रुटि मिलती रहती है

अनुरोध से मेल खाते कई क्रियाएं मिलीं: वेबपीआई

मैं इस बारे में अन्य समान प्रश्नों पर स्टैक पर देख रहा था लेकिन मुझे यह नहीं मिला।

मेरे पास 2 अलग-अलग नाम हैं और "HttpGet" विशेषता का उपयोग कर रहे हैं

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

कृपया जांचें कि आपके पास दो विधियां हैं जिनमें अलग-अलग नाम और समान पैरामीटर हैं।

यदि ऐसा है तो कृपया किसी भी विधि को हटाएं और कोशिश करें।


सुनिश्चित करें कि आप डिफ़ॉल्ट नियंत्रक के लिए अपने कंट्रोलर विधियों को सजाने नहीं हैं | PUT | POST | [HttpPost / Put / Get / Delete] विशेषता के साथ क्रियाएं हटाएं। मैंने अपने वेनिला पोस्ट कंट्रोलर एक्शन में यह एटिब्यूट जोड़ा था और इससे 404 का कारण बन गया।

उम्मीद है कि यह किसी की मदद करता है क्योंकि यह बहुत निराशाजनक हो सकता है और रुकावट में प्रगति ला सकता है।


अतिरिक्त क्रियाओं के साथ मेरे वेबएपीआई नियंत्रकों को बढ़ाने की कोशिश करते समय मैंने इस समस्या पर ठोकर खाई है।

मान लें कि आपके पास होगा

public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

[HttpGet]
public void ReSeed()
{
    // Your custom action here
}

अब दो विधियां हैं जो / एपीआई / नियंत्रक के अनुरोध को पूरा करती हैं जो टीएस द्वारा वर्णित समस्या को ट्रिगर करती है।

मैं अपने अतिरिक्त कार्यों में "डमी" पैरामीटर नहीं जोड़ना चाहता था इसलिए मैंने डिफ़ॉल्ट कार्रवाइयों में देखा और इसके साथ आया:

[ActionName("builtin")]
public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

बाध्यकारी "दोहरी" मार्ग के साथ संयोजन में पहली विधि के लिए:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "builtin", id = RouteParameter.Optional },
    constraints: new { id = @"\d+" });

config.Routes.MapHttpRoute(
    name: "CustomActionApi",
    routeTemplate: "api/{controller}/{action}");

ध्यान दें कि भले ही पहले रूट टेम्पलेट में कोई "एक्शन" पैरामीटर नहीं है, फिर भी आप एक सामान्य कार्रवाई को कॉन्फ़िगर कर सकते हैं जो हमें "सामान्य" वेबएपीआई कॉल और अतिरिक्त कार्रवाई के लिए कॉल को अलग करने की इजाजत देता है।


वेब एपीआई 2 के रूप में अद्यतन करें।

इस एपीआई कॉन्फ़िगरेशन के साथ आपकी WebApiConfig.cs फ़ाइल में:

public static void Register(HttpConfiguration config)
{
    //// Web API routes
    config.MapHttpAttributeRoutes(); //Don't miss this

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = System.Web.Http.RouteParameter.Optional }
    );
}

आप हमारे नियंत्रक को इस तरह से रूट कर सकते हैं:

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    rturn null;
}

[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

जहां नियंत्रकनाम आपके नियंत्रक का नाम है (बिना "नियंत्रक")। यह आपको ऊपर वर्णित मार्ग के साथ प्रत्येक कार्रवाई करने की अनुमति देगा।

आगे पढ़ने के लिए: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2


मुझे पता है कि यह एक पुराना सवाल है, लेकिन कभी-कभी, जब आप वेबपैली से कनेक्ट करने के लिए एंगुलरजेएस से सेवा संसाधनों का उपयोग करते हैं, तो सुनिश्चित करें कि आप सही मार्ग का उपयोग कर रहे हैं, अन्यथा यह त्रुटि होती है।


कार्यों का उपयोग किए बिना विकल्प होंगे:

  1. तरीकों में से एक को एक अलग नियंत्रक में ले जाएं, ताकि वे टकराव न करें।

  2. केवल एक विधि का प्रयोग करें जो परम लेता है, और यदि यह आपके कोड से दूसरी विधि को शून्य करता है।


वेब एपीआई (डिफ़ॉल्ट रूप से) विधियों को HTTP विधि और मार्ग मानों के संयोजन के आधार पर चुना जाता है।

MyVm एक जटिल वस्तु की तरह दिखता है, जो शरीर से फ़ॉर्मेटर द्वारा पढ़ा जाता है ताकि रूट डेटा के संदर्भ में आपके पास दो समान तरीके हों (क्योंकि उनमें से कोई भी मार्ग से कोई पैरामीटर नहीं है) - जिससे प्रेषक ( IHttpActionSelector ) से मिलान करना असंभव हो जाता है उपयुक्त एक

अस्पष्टता को हल करने के लिए आपको क्वेरीस्ट्रिंग या रूट पैरामीटर द्वारा उन्हें अलग करने की आवश्यकता है।


वेब पर बहुत सारी खोज करने के बाद और रूटिंग के लिए सबसे उपयुक्त फॉर्म ढूंढने का प्रयास करने पर निम्नलिखित पाया गया है

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

ये मानचित्रण क्रिया नाम मैपिंग और मूल http सम्मेलन (GET, POST, PUT, DELETE) दोनों पर लागू होते हैं


यह समाधान मेरे लिए काम किया।

कृपया WebApiConfig में पहले रूट 2 रखें। प्रत्येक विधि से पहले HttpGet और HttpPost भी जोड़ें और यूआरएल में नियंत्रक का नाम और विधि नाम शामिल करें।

WebApiConfig =>

config.Routes.MapHttpRoute(
           name: "MapByAction",
           routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional });
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional });

नियंत्रक =>

public class ValuesController : ApiController
{

    [HttpPost]
    public string GetCustomer([FromBody] RequestModel req)
    {
        return "Customer";
    }

    [HttpPost]
    public string GetCustomerList([FromBody] RequestModel req)
    {
        return "Customer List";
    }
}

यूआरएल =>

http://localhost:7050/api/Values/GetCustomer

http://localhost:7050/api/Values/GetCustomerList

वेब एपीआई नियंत्रक के बजाय एमवीसी नियंत्रक का उपयोग करने के कारण यह संभव है। वेब एपीआई नियंत्रक में नेमस्पेस की जांच करें, यह निम्नानुसार होना चाहिए

using System.Net;
using System.Net.Http;
using System.Web.Http;

यदि नामस्थान निम्नानुसार है तो यह वेब एपीआई नियंत्रक विधि कॉलिंग में त्रुटि प्रदान करता है

using System.Web;
using System.Web.Mvc;

नीचे दिए गए सभी मानकों के लिए प्रारंभिक डिफ़ॉल्ट मान का उपयोग करें

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}




c# .net asp.net-web-api asp.net-web-api-routing