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





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


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

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

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

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

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

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

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



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

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) दोनों पर लागू होते हैं




आपका मार्ग नक्शा शायद इस तरह कुछ है:

routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });

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

routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });

ध्यान दें कि मार्ग टेम्पलेट में अब एक क्रिया शामिल है। यहां बहुत अधिक जानकारी है: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

अद्यतन करें:

ठीक है, अब मुझे लगता है कि मैं समझता हूं कि आप यहां क्या कर रहे हैं, यह एक और है:

शायद आपको एक्शन यूआरएल पैरामीटर की आवश्यकता नहीं है और आपको उस सामग्री का वर्णन करना चाहिए जो आप किसी अन्य तरीके से कर रहे हैं। चूंकि आप कह रहे हैं कि विधियां एक ही इकाई से डेटा लौट रही हैं तो पैरामीटर को आपके लिए वर्णन करने दें।

उदाहरण के लिए आपके दो तरीकों को बदल दिया जा सकता है:

public HttpResponseMessage Get()
{
    return null;
}

public HttpResponseMessage Get(MyVm vm)
{
    return null;
}

आप MyVm ऑब्जेक्ट में किस प्रकार का डेटा गुजर रहे हैं? यदि आप यूआरआई के माध्यम से चर को पास करने में सक्षम हैं, तो मैं उस मार्ग पर जाने का सुझाव दूंगा। अन्यथा, आपको ऑब्जेक्ट को अनुरोध के मुख्य भाग में भेजने की आवश्यकता होगी और यह एक GET करते समय आपके बारे में बहुत HTTP नहीं है (हालांकि यह काम करता है, केवल [FromBody] MyVm के सामने उपयोग करें)।

उम्मीद है कि यह दिखाता है कि आपके पास एक्शन नाम या यहां तक ​​कि [HttpGet] विशेषता का उपयोग किए बिना एक ही नियंत्रक में एकाधिक GET विधियां हो सकती हैं।




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

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




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

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

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 }
);



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

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




वेब एपीआई 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




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

कृपया 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



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

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

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}");

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




यह संभव हो सकता है कि आपके वेबमाइड्स को उसी यूआरएल में हल किया जा रहा हो। निम्न लिंक पर एक नज़र डालें: -

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

इसलिए, आपको अपनी रूटिंग तालिका में अपना विधि नाम जोड़ना पड़ सकता है।




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

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

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




आप ExpandoObject Class उपयोग कर सकते हैं जो System.Dynamic है। ExpandoObject Class नेमस्पेस।

dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });

अधिक जानकारी ExpandoObject एमएसडीएन में पाई जा सकती है







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