दिलचस्प पोस्ट
विंडोज फोन 8 से साझा करना विजुअल स्टूडियो 2013 इंटेलियसएक्स ASP.NET MVC5 नियंत्रकों के लिए काम करना बंद कर देता है Isomorphic प्रतिक्रिया घटकों में सीएसएस फ़ाइलों को आयात करना SQLite डेटाबेस को एक संस्करण से दूसरे में नवीनीकृत करें? उदाहरण के बारे में "व्यवहार में जावा संगतता" के बारे में सवाल क्या मैं एक संपूर्ण HTML दस्तावेज़ को इंटरनेट एक्सप्लोरर में किसी दस्तावेज़ खंड में लोड कर सकता हूं? नए बाह्य भंडारण ध्वज के साथ कोर डेटा में UIImage को संग्रहीत करना PHP के साथ पीडीएफ के लिए वर्ड डॉक, डॉकएक्स और एक्सेल एक्सएलएस, एक्सएलएसएक्स कन्वर्ट करें JQuery का इस्तेमाल करते हुए स्पान के लिए एक मान कैसे सेट करें C ++ अंतर्निहित प्रतिलिपि निर्माता जो कि अन्य वस्तुओं वाले वर्ग के लिए Rails पर रूबी में has_many आइटम की संख्या को मान्य करें सी – स्कैनफ़ () बनाम हो जाता है () vs fgets () आईओएस ऑटो लेआउट में बटन के लिए बराबर अंतर और समान चौड़ाई कैसे जोड़ें कस्टम वर्ग विशेषता वाले सभी वर्गों को कैसे गणना करें? कैसे django टेम्पलेट में {{या}} से बचने के लिए?

एएसपी.नेट वेब एपीआई में कस्टम विधि नाम

मैं डब्लूसीएफ वेब एपीआई से नए एएसपी.नेट एमवीसी 4 वेब एपीआई में परिवर्तित कर रहा हूं। मेरे पास एक उपयोगकर्ता नियंत्रक है, और मुझे एक प्रमाणिकता नामित विधि रखना है। मैं GetAll, GetOne, Post, और Delete कैसे करने के उदाहरण देखता हूं, लेकिन अगर मैं इन सेवाओं में अतिरिक्त विधियां जोड़ना चाहता हूं, तो क्या होगा? उदाहरण के लिए, मेरे उपयोगकर्ता सेवा की एक विधि को प्रमाणित करना चाहिए, जहां वे उपयोगकर्ता नाम और पासवर्ड में पास करते हैं, हालांकि यह काम नहीं करता है।

public class UsersController : BaseApiController { public string GetAll() { return "getall!"; } public string Get(int id) { return "get 1! " + id; } public User GetAuthenticate(string userName, string password, string applicationName) { LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}", userName, password, applicationName)); //check if valid leapfrog login. var decodedUsername = userName.Replace("%40", "@"); var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty; var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword); if (leapFrogUsers.Count > 0) { return new User { Id = (uint)leapFrogUsers[0].Id, Guid = leapFrogUsers[0].Guid }; } else throw new HttpResponseException("Invalid login credentials"); } } 

मैं मैपी / एपीआई / यूजर को ब्राउज़ कर सकता हूं और यह GetAll को कॉल कर सकता है और मैपई / एपीआई / यूजर्स / 1 पर ब्राउज़ कर सकते हैं और इसे कॉल कर सकते हैं, हालांकि अगर मैं मेपी / एपीआई / यूजर्स / प्राइज़िकेट करेंगे तो यूज़रनेम = {0} और पासवर्ड = {1} तो इसे प्राप्त करें (प्रमाणीकृत नहीं) और त्रुटि:

मापदंडों में पैरामीटर 'आईडी' के लिए गैर-नल योग्य प्रकार 'System.Int32' के लिए एक नल प्रविष्टि है जिसमें 'सिस्टम। स्ट्रिंग प्राप्त (इंट 32)' के लिए 'नवट्रैक। सेवाएं। सीसीएन। एनएआरटीकएपीआई। कंट्रोलर्स। यूजर कंट्रोलर' एक वैकल्पिक पैरामीटर एक संदर्भ प्रकार, एक नल योग्य प्रकार होना चाहिए, या एक वैकल्पिक पैरामीटर के रूप में घोषित किया जाना चाहिए।

मैं कस्टम विधि नामों जैसे कि प्रमाणिकता कैसे कॉल कर सकता हूं?

Solutions Collecting From Web of "एएसपी.नेट वेब एपीआई में कस्टम विधि नाम"

डिफ़ॉल्ट रूप से रूट कॉन्फ़िगरेशन रीस्टफ़ूल सम्मेलनों का अर्थ है जिसका मतलब है कि यह केवल गेट, पोस्ट, प्लेस और हटाए गए कार्रवाई नामों को स्वीकार करेगा (डिफ़ॉल्ट रूप से रूट पर देखें)। डिफ़ॉल्ट रूप से यह आपको किसी भी एक्शन नेम को निर्दिष्ट करने की अनुमति नहीं देता है => यह प्रेषण के लिए HTTP क्रिया का उपयोग करता है)। इसलिए जब आप /api/users/authenticate को जीईटी अनुरोध भेजते हैं /api/users/authenticate करते हैं कि आप मूल रूप से Get(int id) कार्रवाई को बुला रहे हैं और id=authenticate जो स्पष्ट रूप से क्रैश करता है क्योंकि आपका प्राप्त कार्य एक पूर्णांक की अपेक्षा करता है

यदि आप मानक से भिन्न एक्शन नाम चाहते हैं तो आप global.asax में अपनी रूट परिभाषा को संशोधित कर सकते हैं:

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

अब आप /api/values/getauthenticate को प्रमाणित करने के लिए /api/values/getauthenticate पर नेविगेट कर सकते हैं।

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

मैं दिन MVC4 दुनिया में हूँ

इसके मूल्य के लिए, मेरे पास एक साइटएपिकंट्रोलर है, और मुझे एक कस्टम विधि की जरूरत है, जिसे इस तरह से बुलाया जा सकता है:

 http://localhost:9000/api/SitesAPI/Disposition/0 

विभिन्न स्वभाव के साथ रिकॉर्ड प्राप्त करने के लिए अंतिम पैरामीटर के विभिन्न मानों के साथ।

अंत में मेरे लिए क्या काम किया गया था:

SitesAPIController में विधि:

 // GET api/SitesAPI/Disposition/1 [ActionName("Disposition")] [HttpGet] public Site Disposition(int disposition) { Site site = db.Sites.Where(s => s.Disposition == disposition).First(); return site; } 

और यह WebApiConfig.cs में है

 // this was already there config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); // this i added config.Routes.MapHttpRoute( name: "Action", routeTemplate: "api/{controller}/{action}/{disposition}" ); 

जब तक मैं {निशाना} को {आईडी} नाम दे रहा था, तब तक मैं इसका सामना कर रहा था:

 { "Message": "No HTTP resource was found that matches the request URI 'http://localhost:9000/api/SitesAPI/Disposition/0'.", "MessageDetail": "No action was found on the controller 'SitesAPI' that matches the request." } 

जब मैंने इसका नाम बदलकर {disposition} किया तो उसने काम करना शुरू कर दिया। इसलिए जाहिरा तौर पर प्लेसहोल्डर में मान के साथ पैरामीटर नाम का मिलान होता है।

इसे अधिक सटीक / व्याख्यात्मक बनाने के लिए इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें

डिफ़ॉल्ट रूप से वेब एपीआई को एपीआई / {नियंत्रक} / {आईडी} के रूप में यूआरएल की उम्मीद है, इस डिफ़ॉल्ट रूटिंग को ओवरराइड करने के लिए। आप नीचे दो तरीकों से किसी के साथ रूटिंग निर्धारित कर सकते हैं

पहला विकल्प:

WebApiConfig.cs में मार्ग पंजीकरण के नीचे जोड़ें

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

एचटीटीपी गेट और मापदंडों के साथ अपनी कार्रवाई पद्धति को नीचे सजाने के लिए

 [HttpGet] public HttpResponseMessage ReadMyData(string param1, string param2, string param3) { // your code here } 

विधि यूआरएल के ऊपर कॉल करने के लिए नीचे की तरह होगा

http: // localhost: [yourport] / API / MyData / ReadMyData param1 = मान 1 और param2 2 = मान और param3 = value3

दूसरा विकल्प नियंत्रक कक्षा में मार्ग उपसर्ग जोड़ें और नीचे एचटीटीपीटी के साथ अपनी क्रिया पद्धति को सजाने के लिए। इस मामले में कोई भी WebApiConfig.cs को बदलने की आवश्यकता नहीं है। इसमें डिफ़ॉल्ट रूटिंग हो सकती है

 [RoutePrefix("api/{controller}/{action}")] public class MyDataController : ApiController { [HttpGet] public HttpResponseMessage ReadMyData(string param1, string param2, string param3) { // your code here } } 

विधि यूआरएल के ऊपर कॉल करने के लिए नीचे की तरह होगा

http: // localhost: [yourport] / API / MyData / ReadMyData param1 = मान 1 और param2 2 = मान और param3 = value3

नामित कार्रवाइयों की लंबी चर्चा के लिए इस लेख को देखें यह यह भी दिखाता है कि आप "मिल" के साथ क्रिया नाम को प्रीफ़िक्स करने के बजाय [HttpGet] विशेषता का उपयोग कर सकते हैं।

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

अगर आप एएसपी.नेट 5 एएसपी.नेट एमवीसी 6 के साथ उपयोग कर रहे हैं, तो इन उत्तरों में से अधिकांश केवल काम नहीं करेंगे क्योंकि आप आम तौर पर एमवीसी को आपके लिए उचित मार्ग संग्रह (डिफ़ॉल्ट निस्तारण सम्मेलनों का उपयोग करके) बनाते हैं, जिसका अर्थ है आपको किसी भी Routes.MapRoute() नहीं मिलेगा। Routes.MapRoute() पर संपादित करने के लिए कॉल करें

Startup.cs फ़ाइल द्वारा लागू ConfigureServices() Startup.cs ConfigureServices() Startup.cs ConfigureServices() Startup.cs को एएसपी.नेट 5 में निर्मित निर्भरता इंजेक्शन फ़्रेमवर्क के साथ पंजीकृत कर देगा: इस तरह, जब आप उस क्लास में बाद में ApplicationBuilder.UseMvc() कॉल करते हैं, तो एमवीसी फ्रेमवर्क स्वचालित रूप से इन जोड़ देगा अपने ऐप के लिए डिफ़ॉल्ट मार्ग हम ढांचे के स्रोत कोड के भीतर UseMvc() विधि कार्यान्वयन को UseMvc() हुड के पीछे क्या होता है इसकी एक नज़र डाल सकते हैं:

 public static IApplicationBuilder UseMvc( [NotNull] this IApplicationBuilder app, [NotNull] Action<IRouteBuilder> configureRoutes) { // Verify if AddMvc was done before calling UseMvc // We use the MvcMarkerService to make sure if all the services were added. MvcServicesHelper.ThrowIfMvcNotRegistered(app.ApplicationServices); var routes = new RouteBuilder { DefaultHandler = new MvcRouteHandler(), ServiceProvider = app.ApplicationServices }; configureRoutes(routes); // Adding the attribute route comes after running the user-code because // we want to respect any changes to the DefaultHandler. routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute( routes.DefaultHandler, app.ApplicationServices)); return app.UseRouter(routes.Build()); } 

इस बारे में अच्छी बात यह है कि यह ढांचा अब सभी कड़ी मेहनत को संभालता है, सभी नियंत्रक के कार्यों के माध्यम से चल रहा है और अपने डिफ़ॉल्ट मार्गों की स्थापना कर रहा है, इस प्रकार आप कुछ बेमानी काम को सहेज सकते हैं।

बुरी बात ये है, कि आप अपने मार्गों को कैसे जोड़ सकते हैं, इसके बारे में बहुत कम या कोई दस्तावेज नहीं है। सौभाग्य से पर्याप्त, आप एक कन्वेंशन-आधारित और / या एक विशेषता-आधारित दृष्टिकोण (उर्फ एट्रिब्यूट रूटिंग ) का उपयोग करके आसानी से ऐसा कर सकते हैं।

कन्वेंशन के आधार पर

अपने स्टार्टअप सीसीएस वर्ग में, इसे बदलें:

 app.UseMvc(); 

इसके साथ:

 app.UseMvc(routes => { // Route Sample A routes.MapRoute( name: "RouteSampleA", template: "MyOwnGet", defaults: new { controller = "Items", action = "Get" } ); // Route Sample B routes.MapRoute( name: "RouteSampleB", template: "MyOwnPost", defaults: new { controller = "Items", action = "Post" } ); }); 

गुण आधारित

एमवीसी 6 के बारे में एक महान बात यह है कि आप Controller वर्ग और / या उचित RouteAttribute और / या HttpGet / HttpGet टेम्प्लेट पैरामीटर के साथ, निम्न के रूप में सजाने के द्वारा प्रति-नियंत्रक आधार पर मार्गों को भी परिभाषित कर सकते हैं:

 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Mvc; namespace MyNamespace.Controllers { [Route("api/[controller]")] public class ItemsController : Controller { // GET: api/items [HttpGet()] public IEnumerable<string> Get() { return GetLatestItems(); } // GET: api/items/5 [HttpGet("{num}")] public IEnumerable<string> Get(int num) { return GetLatestItems(5); } // GET: api/items/GetLatestItems [HttpGet("GetLatestItems")] public IEnumerable<string> GetLatestItems() { return GetLatestItems(5); } // GET api/items/GetLatestItems/5 [HttpGet("GetLatestItems/{num}")] public IEnumerable<string> GetLatestItems(int num) { return new string[] { "test", "test2" }; } // POST: /api/items/PostSomething [HttpPost("PostSomething")] public IActionResult Post([FromBody]string someData) { return Content("OK, got it!"); } } } 

यह नियंत्रक निम्नलिखित अनुरोधों को संभाल देगा:

  [GET] api/items [GET] api/items/5 [GET] api/items/GetLatestItems [GET] api/items/GetLatestItems/5 [POST] api/items/PostSomething 

यह भी ध्यान रखें कि यदि आप दो तरीकों का उपयोग करते हैं, तो विशेषता-आधारित मार्ग (जब परिभाषित) कन्वेंशन-आधारित लोगों को ओवरराइड कर देगा, और दोनों ही UseMvc() द्वारा परिभाषित डिफ़ॉल्ट मार्गों को ओवरराइड करेगा।

अधिक जानकारी के लिए, आप निम्न पोस्ट भी पढ़ सकते हैं।