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




.net asp.net-web-api (9)

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

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

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 "प्राप्त करें" विधियों का प्रयास करता हूं तो मुझे यह त्रुटि मिलती रहती है

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

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

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

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

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

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

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 विधियां हो सकती हैं।


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

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


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


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

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

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


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

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

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


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

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

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

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

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

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





asp.net-web-api-routing