दिलचस्प पोस्ट
रीफ्रैर-राउटर यूआरएल काम नहीं करते हैं जब मैन्युअल रूप से रीफ्रेश करना या रिक्ति करना डिवाइस में वर्चुअल कीबोर्ड की ऊंचाई प्राप्त करने के लिए Android में कोई तरीका है Php में ob_start () का उपयोग क्या है? सी में एक स्टैक ट्रेस कैसे पकड़ सकता है? कैसे datagridview प्रोग्राम को नई पंक्ति में जोड़ने के लिए एक HTML5 तालिका में स्क्रॉलबार कैसे जोड़ें? पुराने प्रमाणन का उपयोग करके MySQL 4.1+ से कनेक्ट नहीं हो सकता स्विफ्ट के साथ इंटरनेट कनेक्शन की जांच करें एक सरल jQuery के फार्म सत्यापन स्क्रिप्ट सी # अमिट में फ़्लोटिंग पॉइंट अंकगणित क्यों है? जीसीडी, थ्रेड्स, प्रोग्राम फ्लो और यूआई अपडेटिंग सी # जुड़ती / जहां Linq और लैम्ब्डा के साथ दो-तरफ़ा एन्क्रिप्शन: मुझे ऐसे पासवर्ड संग्रहीत करने की आवश्यकता होती है जिन्हें पुनर्प्राप्त किया जा सकता है स्पष्ट वादा निर्माण antipattern क्या है और मैं इसे कैसे से बचने करूँ? कोई पैरामीटर (वास्तविक फ़ंक्शन परिभाषा की तुलना में) के साथ एक समारोह क्यों संकलित करता है?

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

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

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 उपयोग किया 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 के ExecuteAsync विधि को ओवरराइड करते ExecuteAsync इस समस्या का दृष्टिकोण करने की कोशिश कर रहा ApiController लेकिन अब तक कोई किस्मत नहीं है। इस मुद्दे पर कोई सलाह?

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

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

इस तरह से मुझे अतिरिक्त जीईटी पद्धतियों का समर्थन करने के लिए सबसे अच्छा तरीका मिल गया है और साथ ही सामान्य आराम तरीकों का भी समर्थन मिलता है। अपने 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 विशेषता जोड़ना चाह सकते हैं।

इस से जाएं:

 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 / command / postcreateUser" पर पोस्ट करने का आह्वान करते हैं:

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

और "http: // localhost: 8383 / एपीआई / कमांड / पोस्ट मेकबुकिंग" पर पोस्टिंग कहती है :

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

मैंने स्वयं को वेब एपीआई सेवा अनुप्रयोग की मेजबानी में इसकी कोशिश की और यह एक जादू की तरह काम करता है 🙂

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

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

आपको अपने वेबपिकॉनफ़िग में इसकी भी आवश्यकता है

 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-startedwith-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

आपको इस तरह ग्लोबल.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 } ); 

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

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

अब वैश्विक। एएसएक्स में

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

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

मेरा मानना ​​है कि मुझे एक ऐसी ही समस्या है और स्पष्ट रूप से यह बता रहा है कि किस पद्धति (जीईटी / पीयूटी / पोस्ट / डेली) को सबसे ज्यादा उम्मीद है, अगर सभी नहीं, मेरे तरीके

 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) { ... } } 

वेबगेट को इसे संभाल करना चाहिए लेकिन मैंने देखा है कि इसमें कई समस्याएं हैं, बहुत से कम प्राप्त करें एक ही वापसी प्रकार के प्राप्त करें

[संपादित करें: इनमें से कोई भी WCF WebAPI की सूर्यास्त और MVC स्टैक पर एएसपी.नेट वेबएपीआई के लिए माइग्रेशन के साथ वैध है]

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

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

… कंट्रोलर के शीर्ष पर एक [रूटईफ्रफ़िक्स] को भी बिना भी रख दिया गया है:

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

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

उपरोक्त कोई भी उदाहरण मेरी व्यक्तिगत आवश्यकताओं के लिए काम नहीं करता है नीचे मैं क्या करना समाप्त कर रहा है

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

उपर्युक्त में यह मूलतः निम्नलिखित यूआरएल => http://www.domain.com/Account/Status/Active या कुछ ऐसा दिखता है।

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

उपर्युक्त समाधान समाधानों में से कोई भी काम नहीं किया जा सकता है – कुछ वाक्यविन्यास बदल गए हैं और मैं अभी भी एमवीसी के लिए नया हूं – एक चुटकी में, हालांकि मैंने यह वास्तव में बहुत ही भयानक (और सरल) हैक जो मुझे मिलेगा अब तक – ध्यान दें, यह "सार्वजनिक 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; } 

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


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

WebApiConfig को संशोधित करें और अंत में एक और रूट्स जोड़ें। 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"; } } 

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

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

यदि GET विधियों को पारित किया गया पैरामीटर विशेषता राउटिंग सिस्टम के लिए उनके प्रकारों को अलग करने के लिए काफी अलग है, जैसे कि int एस और Guid के मामले में आप [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/