ASP.NET वेब एपीआई में कई GET विधियों के साथ एकल नियंत्रक


167

वेब एपीआई में मेरे पास समान संरचना का एक वर्ग था:

public class SomeController : ApiController
{
    [WebGet(UriTemplate = "{itemSource}/Items")]
    public SomeValue GetItems(CustomParam parameter) { ... }

    [WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

चूंकि हम अलग-अलग तरीकों का नक्शा बना सकते हैं, इसलिए सही जगह पर सही अनुरोध प्राप्त करना बहुत सरल था। समान वर्ग के लिए जिसके पास केवल एक ही GETविधि थी, लेकिन एक Objectपैरामीटर भी था , मैंने सफलतापूर्वक उपयोग किया IActionValueBinder। हालाँकि, ऊपर वर्णित मामले में मुझे निम्नलिखित त्रुटि मिलती है:

Multiple actions were found that match the request: 

SomeValue GetItems(CustomParam parameter) on type SomeType

SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType

मैं इस समस्या को दूर करने की कोशिश कर रहा हूं ExecuteAsync, ApiControllerलेकिन अभी तक कोई भाग्य नहीं है। इस मुद्दे पर कोई सलाह?

संपादित करें: मैं यह उल्लेख करना भूल गया कि अब मैं ASP.NET वेब एपीआई पर इस कोड को स्थानांतरित करने का प्रयास कर रहा हूं जिसमें रूटिंग के लिए एक अलग दृष्टिकोण है। सवाल यह है कि मैं ASP.NET वेब एपीआई पर कोड काम कैसे कर सकता हूं?


1
क्या आपको अभी भी रूट पेरेटर के रूप में {पैरेंट} मिला है।
एंटनी स्कॉट

हाँ, मैंने किया। शायद मैं IActionValueBinder का गलत तरीके से उपयोग कर रहा हूं क्योंकि इंट आईडी (डेमो में) जैसे प्रकार के लिए यह ठीक काम करता है।
पौलियस_एल

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

वर्तमान में हम असंतुष्ट हो रहे हैं, अगर नीचे के दृष्टिकोण (कई मार्गों के साथ) उचित REST नियमों के विरुद्ध हैं? मेरी राय में यह ठीक है। मेरे सहकर्मी को लगता है कि यह अच्छा नहीं है। इस पर कोई टिप्पणी?
रेमी

जब मैं REST के बारे में पढ़ना शुरू करता था तो मैं आमतौर पर इसके खिलाफ था। मुझे अभी भी यकीन नहीं है कि यह एक उचित दृष्टिकोण है लेकिन कभी-कभी यह अधिक सुविधाजनक या उपयोगकर्ता के अनुकूल है, इसलिए नियमों को थोड़ा झुकना इतना बुरा नहीं हो सकता है। जब तक यह एक विशेष समस्या को हल करने के लिए काम करता है। इस प्रश्न को पोस्ट किए हुए 6 महीने बीत चुके हैं और हमें इस दृष्टिकोण का उपयोग करने के लिए कोई पछतावा नहीं है।
paulius_l 15

जवाबों:


249

यह सबसे अच्छा तरीका है जो मैंने अतिरिक्त GET विधियों का समर्थन करने और सामान्य REST विधियों का समर्थन करने के लिए पाया है। निम्नलिखित मार्गों को अपने WebApiConfig में जोड़ें:

routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");
routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new {action = "Post"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Post)});

मैंने नीचे दिए गए परीक्षण वर्ग के साथ इस समाधान को सत्यापित किया। मैं अपने नियंत्रक में प्रत्येक विधि को सफलतापूर्वक हिट करने में सक्षम था:

public class TestController : ApiController
{
    public string Get()
    {
        return string.Empty;
    }

    public string Get(int id)
    {
        return string.Empty;
    }

    public string GetAll()
    {
        return string.Empty;
    }

    public void Post([FromBody]string value)
    {
    }

    public void Put(int id, [FromBody]string value)
    {
    }

    public void Delete(int id)
    {
    }
}

मैंने सत्यापित किया कि यह निम्नलिखित अनुरोधों का समर्थन करता है:

GET /Test
GET /Test/1
GET /Test/GetAll
POST /Test
PUT /Test/1
DELETE /Test/1

ध्यान दें कि यदि आपकी अतिरिक्त GET क्रियाएं 'Get' से शुरू नहीं होती हैं, तो आप विधि में HttpGet विशेषता जोड़ना चाहते हैं।


4
यह एक महान जवाब है और इसने मुझे एक और संबंधित प्रश्न के साथ बहुत मदद की। धन्यवाद!!
अल्फेरो चिंगोनो

4
इस की कोशिश की - काम करने के लिए प्रकट नहीं होता है। मार्ग सभी बेतरतीब ढंग से GetBlah (लंबी आईडी) विधि से मैप किए जाते हैं। :(
BrainSlugs83

1
@ BrainSlugs83: यह आदेश पर निर्भर करता है। और आप (with "withId" विधियों) को जोड़ना चाहेंगे,constraints: new{id=@"\d+"}
एरिक फाल्केन

4
कैसे एक और विधि जोड़ने के बारे में - जाओ (इंट आईडी, स्ट्रिंग नाम)? ... यह विफल रहता है
अनिल पुरस्वानी

1
मुझे routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});अपने Putतरीके के लिए एक अतिरिक्त मार्ग जोड़ना पड़ा, अन्यथा यह मुझे 404 दे रहा था।
सैयद अली ताकी

57

इससे जाओ:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });

इसके लिए:

config.Routes.MapHttpRoute("API Default", "api/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional });

इसलिए, अब आप यह निर्दिष्ट कर सकते हैं कि आप अपना HTTP अनुरोध किस क्रिया (विधि) को भेजना चाहते हैं।

पर पोस्ट "http: // localhost: 8383 / API / कमांड / PostCreateUser" का आह्वान:

public bool PostCreateUser(CreateUserCommand command)
{
    //* ... *//
    return true;
}

और पोस्ट करने के लिए ": // स्थानीय होस्ट 8383 / API / कमांड / PostMakeBooking http" का आह्वान:

public bool PostMakeBooking(MakeBookingCommand command)
{
    //* ... *//
    return true;
}

मैं एक स्वयं की मेजबानी की WEB एपीआई सेवा आवेदन में यह कोशिश की और यह एक आकर्षण की तरह काम करता है :)


8
उपयोगी उत्तर के लिए धन्यवाद। मैं यह जोड़ना चाहता हूं कि यदि आप Get, Post, आदि के साथ अपने तरीके के नाम शुरू करते हैं, तो आपके अनुरोध उन तरीकों पर मैप करेंगे जो HTTP वर्ब इस्तेमाल किए गए थे। लेकिन आप भी अपने तरीकों कुछ भी नाम दे सकते हैं, और फिर उन्हें साथ सजाने [HttpGet], [HttpPost]आदि विधि के लिए क्रिया मैप करने के लिए जिम्मेदार बताते हैं।
indot_brad

कृपया मेरा प्रश्न
Moeez

@DikaArtaKarunia कोई समस्या नहीं, खुशी है कि मेरा जवाब अभी भी 6 साल बाद लागू होता है: D
uggeh

31

मैं उन्हें कोड के माध्यम से मैन्युअल रूप से जोड़ने की तुलना में उपयोग करने के लिए क्लीनर होने के लिए विशेषताएँ ढूंढता हूं। ये रहा एक सरल उदाहरण।

[RoutePrefix("api/example")]
public class ExampleController : ApiController
{
    [HttpGet]
    [Route("get1/{param1}")] //   /api/example/get1/1?param2=4
    public IHttpActionResult Get(int param1, int param2)
    {
        Object example = null;
        return Ok(example);
    }

}

आपको अपने webapiconfig में भी इसकी आवश्यकता है

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

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

कुछ अच्छे लिंक http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api यह रूटिंग को बेहतर बताते हैं। http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api


3
मुझे काम करने के लिए रूट विशेषताओं को प्राप्त करने के config.MapHttpAttributeRoutes();लिए मेरे साथ WebApiConfig.cs, और GlobalConfiguration.Configuration.EnsureInitialized();मेरी WebApiApplication.Application_Start()विधि के अंत में भी जोड़ने की आवश्यकता थी ।
एर्गवॉन

@Ergwun इस टिप्पणी से मुझे बहुत मदद मिली। बस इसे जोड़ने के लिए, config.MapHttpAttributeRoutes();मार्ग मानचित्रण से पहले प्रदर्शित होने की आवश्यकता है (जैसे पहले config.Routes.MappHttpRoute(...
फिलिप स्ट्रैटफ़ोर्ड

11

आपको Global.asax.cs में आगे के मार्गों को परिभाषित करने की आवश्यकता है:

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

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

5
हां, यह सच है लेकिन वास्तव में उन मार्गों का उदाहरण देखना अच्छा होगा। यह समुदाय के लिए इस उत्तर को अधिक मूल्यवान बना देगा। (और आपको मुझसे एक +1 मिलेगा :)
अरन मुल्होलैंड

आप यहां एक उदाहरण पढ़ सकते हैं - stackoverflow.com/questions/11407267/…
टॉम केर्खोव

2
एक वास्तविक समाधान अच्छा होगा।
इतने सारे Goblins

6

नए वेब एपि 2 के साथ कई तरीके प्राप्त करना आसान हो गया है।

यदि GETविधियों में दिए गए पैरामीटर उनके प्रकार को अलग करने के लिए विशेषता रूटिंग सिस्टम के लिए पर्याप्त भिन्न होते हैं जैसा कि ints और Guids के साथ होता है, तो आप अपेक्षित प्रकार को निर्दिष्ट कर सकते हैं[Route...] विशेषता

उदाहरण के लिए -

[RoutePrefix("api/values")]
public class ValuesController : ApiController
{

    // GET api/values/7
    [Route("{id:int}")]
    public string Get(int id)
    {
       return $"You entered an int - {id}";
    }

    // GET api/values/AAC1FB7B-978B-4C39-A90D-271A031BFE5D
    [Route("{id:Guid}")]
    public string Get(Guid id)
    {
       return $"You entered a GUID - {id}";
    }
} 

इस दृष्टिकोण के बारे में अधिक जानकारी के लिए, यहां देखें http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/

एक अन्य विकल्प GETतरीकों को अलग-अलग मार्ग देना है।

    [RoutePrefix("api/values")]
    public class ValuesController : ApiController
    {
        public string Get()
        {
            return "simple get";
        }

        [Route("geta")]
        public string GetA()
        {
            return "A";
        }

        [Route("getb")]
        public string GetB()
        {
            return "B";
        }
   }

अधिक जानकारी के लिए यहां देखें - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/


5

ASP.NET Core 2.0 में आप कंट्रोलर को रूट विशेषता जोड़ सकते हैं :

[Route("api/[controller]/[action]")]
public class SomeController : Controller
{
    public SomeValue GetItems(CustomParam parameter) { ... }

    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

4

मैं कई तरीकों के लिए अनुमति देने के लिए वेब एपी 2 विशेषता रूटिंग का उपयोग करने की कोशिश कर रहा था, और मैंने पिछले उत्तरों से उपयोगी सुझावों को शामिल किया था, लेकिन नियंत्रक में मैंने केवल "विशेष" विधि (उदाहरण) को सजाया था:

[Route( "special/{id}" )]
public IHttpActionResult GetSomethingSpecial( string id ) {

... बिना नियंत्रक के शीर्ष पर एक [रूटप्रिफ़िक्स] रखने के बिना:

[RoutePrefix("api/values")]
public class ValuesController : ApiController

मुझे यह बताते हुए त्रुटियां हो रही थीं कि कोई रूट सबमिट किए गए URI से मेल नहीं खाता था। एक बार जब मैं दोनों [रूट] विधि को सजाने के साथ-साथ [रूटप्रिफ़िक्स] नियंत्रक को एक पूरे के रूप में सजाता था, तो यह काम करता था।


3

मुझे यकीन नहीं है कि यू का जवाब मिल गया है, लेकिन मैंने यह किया और यह काम करता है

public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

// GET /api/values/5
public string Get(int id)
{
    return "value";
}

// GET /api/values/5
[HttpGet]
public string GetByFamily()
{
    return "Family value";
}

अब Global.asx में

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

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

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

3

क्या आपने WebInvokeAttribute पर स्विच करने और "GET" की विधि सेट करने का प्रयास किया है?

मेरा मानना ​​है कि मुझे एक समान समस्या थी और यह स्पष्ट रूप से बताने के लिए स्विच किया गया कि कौन सी विधि (GET / PUT / POST / DELETE) सबसे अधिक अपेक्षित है, यदि सभी नहीं, तो मेरे तरीके।

public class SomeController : ApiController
{
    [WebInvoke(UriTemplate = "{itemSource}/Items"), Method="GET"]
    public SomeValue GetItems(CustomParam parameter) { ... }

    [WebInvoke(UriTemplate = "{itemSource}/Items/{parent}", Method = "GET")]
    public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}

WebGet को इसे संभालना चाहिए, लेकिन मैंने देखा है कि इसमें कुछ समस्याएँ हैं एक से अधिक कई मिलें बहुत कम मिलते हैं एक ही रिटर्न प्रकार।

[संपादित करें: इसमें से कोई भी WCF WebAPI के सूर्यास्त और MVC स्टैक पर ASP.Net WebAPI के प्रवास के साथ मान्य नहीं है]


1
मुझे खेद है, मैं यह उल्लेख करना भूल गया कि मैं ASP.NET वेब एपीआई के लिए कोड को स्थानांतरित कर रहा हूं क्योंकि WCF वेब एपीआई को बंद कर दिया गया था। मैंने पोस्ट को एडिट किया। धन्यवाद।
पाओलियस_एल

2
**Add Route function to direct the routine what you want**
    public class SomeController : ApiController
    {
        [HttpGet()]
        [Route("GetItems")]
        public SomeValue GetItems(CustomParam parameter) { ... }

        [HttpGet()]
        [Route("GetChildItems")]
        public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
    }

ढेर अतिप्रवाह में आपका स्वागत है! कृपया अपने उत्तर को अपने कोड के लिए एक विवरण शामिल करने के लिए संपादित करें , साथ ही साथ यह भी वर्णन है कि यह कैसे चौदह अन्य उत्तरों से अलग है। यह सवाल लगभग आठ साल पुराना है , और पहले से ही एक स्वीकृत और कई अच्छी तरह से समझाया गया उत्तर है। पर एक विवरण के बिना तुम्हारा , यह संभावना downvoted या हटा दिया जाएगा। उस स्पष्टीकरण के होने से इस प्रश्न पर आपके उत्तर के स्थान को सही ठहराने में मदद मिलेगी।
दास_गीक

1
व्यक्तिगत रूप से (मुझे पता है कि एसओ की सिफारिशें क्या हैं) एक प्रश्न के लिए यह स्पष्ट / बुनियादी है कि मैं व्यक्तिगत रूप से बहुत अधिक होगा बल्कि एक शुद्ध कोड का जवाब होगा। मैं बहुत सारे स्पष्टीकरण नहीं पढ़ना चाहता हूं मैं सहायक कार्यात्मक सॉफ्टवेयर को तेजी से बनाना चाहता हूं । +1
मेमडेवेल्टर

2

आलसी / जल्दी विकल्प (डॉटनेट कोर 2.2):

[HttpGet("method1-{item}")]
public string Method1(var item) { 
return "hello" + item;}

[HttpGet("method2-{item}")]
public string Method2(var item) { 
return "world" + item;}

उन्हें कॉल करना:

स्थानीय होस्ट: 5000 / API / controllername / method1-42

"Hello42"

स्थानीय होस्ट: 5000 / API / controllername / method2-99

"World99"


0

उपरोक्त किसी भी उदाहरण ने मेरी व्यक्तिगत जरूरतों के लिए काम नहीं किया। नीचे मैं क्या कर रहा हूँ नीचे है।

 public class ContainsConstraint : IHttpRouteConstraint
{       
    public string[] array { get; set; }
    public bool match { get; set; }

    /// <summary>
    /// Check if param contains any of values listed in array.
    /// </summary>
    /// <param name="param">The param to test.</param>
    /// <param name="array">The items to compare against.</param>
    /// <param name="match">Whether we are matching or NOT matching.</param>
    public ContainsConstraint(string[] array, bool match)
    {

        this.array = array;
        this.match = match;
    }

    public bool Match(System.Net.Http.HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
    {
        if (values == null) // shouldn't ever hit this.                   
            return true;

        if (!values.ContainsKey(parameterName)) // make sure the parameter is there.
            return true;

        if (string.IsNullOrEmpty(values[parameterName].ToString())) // if the param key is empty in this case "action" add the method so it doesn't hit other methods like "GetStatus"
            values[parameterName] = request.Method.ToString();

        bool contains = array.Contains(values[parameterName]); // this is an extension but all we are doing here is check if string array contains value you can create exten like this or use LINQ or whatever u like.

        if (contains == match) // checking if we want it to match or we don't want it to match
            return true;
        return false;             

    }

अपने मार्ग उपयोग में उपरोक्त उपयोग करने के लिए:

config.Routes.MapHttpRoute("Default", "{controller}/{action}/{id}", new { action = RouteParameter.Optional, id = RouteParameter.Optional}, new { action = new ContainsConstraint( new string[] { "GET", "PUT", "DELETE", "POST" }, true) });

क्या होता है विधि में बाधक किस्म के नकली होते हैं जिससे यह मार्ग केवल डिफ़ॉल्ट GET, POST, PUT और DELETE विधियों से मेल खाएगा। "सच" में कहा गया है कि हम सरणी में मौजूद वस्तुओं के मिलान के लिए जाँच करना चाहते हैं। यदि यह गलत था, तो आप कह रहे हैं कि आप उन लोगों को बाहर कर दें। फिर आप इस डिफ़ॉल्ट विधि से ऊपर के मार्गों का उपयोग कर सकते हैं जैसे:

config.Routes.MapHttpRoute("GetStatus", "{controller}/status/{status}", new { action = "GetStatus" });

इसके बाद के संस्करण में यह अनिवार्य रूप से निम्नलिखित URL की तलाश में है => http://www.domain.com/Account/Status/Activeया ऐसा कुछ।

ऊपर से मुझे यकीन नहीं है कि मैं बहुत पागल हो जाऊंगा। दिन के अंत में यह प्रति संसाधन होना चाहिए। लेकिन मुझे विभिन्न कारणों से मैत्रीपूर्ण यूआरएल को मैप करने की आवश्यकता है। मुझे बहुत कुछ महसूस हो रहा है क्योंकि वेब आपी विकसित होती है, इसमें किसी प्रकार का प्रावधान होगा। अगर समय मैं एक अधिक स्थायी समाधान और पोस्ट का निर्माण करूँगा।


आप new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete) इसके बजाय उपयोग कर सकते हैं ।
अबिश्चेव २५'१४ को ६:५६

0

उपरोक्त राउटिंग सॉल्यूशंस में से कोई भी काम नहीं कर सका - कुछ सिंटैक्स बदला हुआ लगता है और मैं अभी भी एमवीसी के लिए नया हूं - एक चुटकी में हालांकि मैंने एक साथ रखा यह वास्तव में भयानक (और सरल) हैक जो मुझे मिलेगा अब तक - ध्यान दें, यह "सार्वजनिक MyObject GetMyObjects (लंबी आईडी)" विधि को बदल देता है - हम "आईडी" प्रकार को स्ट्रिंग में बदलते हैं, और वापसी प्रकार को ऑब्जेक्ट में बदलते हैं।

// GET api/MyObjects/5
// GET api/MyObjects/function
public object GetMyObjects(string id)
{
    id = (id ?? "").Trim();

    // Check to see if "id" is equal to a "command" we support
    // and return alternate data.

    if (string.Equals(id, "count", StringComparison.OrdinalIgnoreCase))
    {
        return db.MyObjects.LongCount();
    }

    // We now return you back to your regularly scheduled
    // web service handler (more or less)

    var myObject = db.MyObjects.Find(long.Parse(id));
    if (myObject == null)
    {
        throw new HttpResponseException
        (
            Request.CreateResponse(HttpStatusCode.NotFound)
        );
    }

    return myObject;
}

0

यदि आपके पास एक ही फ़ाइल में कई एक्शन हैं, तो उसी तर्क को पास करें जैसे Id to all Action। ऐसा इसलिए है क्योंकि कार्रवाई केवल आईडी की पहचान कर सकती है, इसलिए तर्क देने के लिए कोई भी नाम देने के बजाय केवल इस तरह से ईद घोषित करें।


[httpget]
[ActionName("firstAction")] firstAction(string Id)
{.....
.....
}
[httpget]
[ActionName("secondAction")] secondAction(Int Id)
{.....
.....
}
//Now go to webroute.config file under App-start folder and add following
routes.MapHttpRoute(
name: "firstAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

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

ब्राउज़र में प्रत्येक फ़ंक्शन को देखने के लिए Url कैसा दिखेगा?
Si8

0

सरल वैकल्पिक

बस एक क्वेरी स्ट्रिंग का उपयोग करें।

रूटिंग

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

नियंत्रक

public class TestController : ApiController
{
    public IEnumerable<SomeViewModel> Get()
    {
    }

    public SomeViewModel GetById(int objectId)
    {
    }
}

अनुरोध

GET /Test
GET /Test?objectId=1

ध्यान दें

ध्यान रखें कि क्वेरी स्ट्रिंग परम "आईडी" या जो भी पैरामीटर कॉन्फ़िगर किए गए मार्ग में है, वह नहीं होना चाहिए।


-1

संशोधित WebApiConfig और अंत इस तरह एक और Routes.MapHttpRoute में जोड़ें:

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

फिर इस तरह एक नियंत्रक बनाएँ:

public class ServiceController : ApiController
{
        [HttpGet]
        public string Get(int id)
        {
            return "object of id id";
        }
        [HttpGet]
        public IQueryable<DropDownModel> DropDowEmpresa()
        {
            return db.Empresa.Where(x => x.Activo == true).Select(y =>
                  new DropDownModel
                  {
                      Id = y.Id,
                      Value = y.Nombre,
                  });
        }

        [HttpGet]
        public IQueryable<DropDownModel> DropDowTipoContacto()
        {
            return db.TipoContacto.Select(y =>
                  new DropDownModel
                  {
                      Id = y.Id,
                      Value = y.Nombre,
                  });
        }

        [HttpGet]
        public string FindProductsByName()
        {
            return "FindProductsByName";
        }
}

इस तरह मैंने इसे हल किया। मुझे उम्मीद है कि यह किसी की मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.