2014-07-19 7 views
19

ASP.NET MVC वेबएपीआई परियोजना में डिफ़ॉल्ट रूप से हम नियंत्रकएएसपी.NET वेबएपीआई नियंत्रक को कस्टम तरीकों को कैसे जोड़ें?

public class ValuesController : ApiController 
    { 
     // GET api/values 
     public IEnumerable<string> Get() 
     { 
      return new string[] { "value1", "value2" }; 
     } 

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

     // POST api/values 
     public void Post([FromBody]string value) 
     { 
     } 

     // PUT api/values/5 
     public void Put(int id, [FromBody]string value) 
     { 
     } 

     // DELETE api/values/5 
     public void Delete(int id) 
     { 
     } 
} 

निम्नलिखित बनाया है लेकिन अब वे मिल/पोस्ट के रूप में अच्छी तरह से समर्थन कर सकते हैं यहाँ किसी भी कस्टम तरीकों को जोड़ने के लिए संभव है?

धन्यवाद! आरंभ करने के लिए

[Route("customers/{customerId}/orders")] 
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... } 

कुछ प्रलेखन:

उत्तर

15

आप इस तरह के Http प्रकार के साथ RoutePrefix के रूप में विशेषताओं का उपयोग कर सकते हैं।

[Route("ChangePassword")] 
[HttpPost] // There are HttpGet, HttpPost, HttpPut, HttpDelete. 
public async Task<IHttpActionResult> ChangePassword(ChangePasswordModel model) 
{   
} 

http प्रकार रूट नाम के साथ संयोजन में इसे अपनी सही विधि पर वापस मैप करेगा।

+0

हाय! जब मैं 'रूट (" MyPath ") इनपुट करने का प्रयास करता हूं] 'VS2013 इसे हल नहीं करता है। इसके अलावा मैं इसे डीबग नहीं कर सकता। यह मुझे '[रूट (" माईपैथ ")]' के बारे में एक त्रुटि देता है। क्या आप जानते हैं कि समस्या क्या है? –

+1

@ClarkKent एमवीसी 5 और वेबएपी 2 में इसका मूल निवासी है, अन्यथा, आपको 'एट्रिब्यूट रूटिंग' –

11

आप मार्ग विशेषता इस्तेमाल कर सकते हैं

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

+1

हाय पर सजाने के लिए कर सकते हैं! जब मैं 'रूट (" MyPath ") इनपुट करने का प्रयास करता हूं] 'VS2013 इसे हल नहीं करता है। इसके अलावा मैं इसे डीबग नहीं कर सकता। यह मुझे '[रूट (" माईपैथ ")]' के बारे में एक त्रुटि देता है। क्या आप जानते हैं कि समस्या क्या है? –

+1

@ क्लार्ककेन्ट - "विशेषता रूटिंग" के लिए NuGet खोजें।आपको शायद एक डीएलएल या दो की जरूरत है। –

14

मुझे यकीन है कि मैं पालन के रूप में आप GET और अपने कोड में वहीं POST है, लेकिन किसी भी मामले में आप अन्य विकल्प हैं नहीं कर रहा हूँ:

विकल्प 1

सबसे पहले, आप में अपने कस्टम मार्गों कॉन्फ़िगर कर सकते हैं WebApiConfig.cs फ़ाइल में फ़ोल्डर।

// GET /api/{resource}/{action} 
    config.Routes.MapHttpRoute(
     name: "Web API RPC", 
     routeTemplate: "{controller}/{action}", 
     defaults: new { }, 
     constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("GET") } 
     ); 

    // GET|PUT|DELETE /api/{resource}/{id}/{code} 
    config.Routes.MapHttpRoute(
     name: "Web API Resource", 
     routeTemplate: "{controller}/{id}/{code}", 
     defaults: new { code = RouteParameter.Optional }, 
     constraints: new { id = @"\d+" } 
     ); 

    // GET /api/{resource} 
    config.Routes.MapHttpRoute(
     name: "Web API Get All", 
     routeTemplate: "{controller}", 
     defaults: new { action = "Get" }, 
     constraints: new { httpMethod = new HttpMethodConstraint("GET") } 
     ); 

    // PUT /api/{resource} 
    config.Routes.MapHttpRoute(
     name: "Web API Update", 
     routeTemplate: "{controller}", 
     defaults: new { action = "Put" }, 
     constraints: new { httpMethod = new HttpMethodConstraint("PUT") } 
     ); 

    // POST /api/{resource} 
    config.Routes.MapHttpRoute(
     name: "Web API Post", 
     routeTemplate: "{controller}", 
     defaults: new { action = "Post" }, 
     constraints: new { httpMethod = new HttpMethodConstraint("POST") } 
     ); 

    // POST /api/{resource}/{action} 
    config.Routes.MapHttpRoute(
     name: "Web API RPC Post", 
     routeTemplate: "{controller}/{action}", 
     defaults: new { }, 
     constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("POST") } 
     ); 

मैं RESTful अंतिम बिंदुओं का एक संयोजन के साथ ही RPC अंतिम बिंदुओं का उपयोग करें: यहाँ मैं सामान्य रूप से उपयोग करें। कुछ शुद्धवादियों के लिए, यह एक पवित्र युद्ध के लिए आधार है। मेरे लिए, मैं दोनों के संयोजन का उपयोग करता हूं क्योंकि यह एक शक्तिशाली संयोजन है और मुझे कोई सौहार्दपूर्ण कारण नहीं मिल रहा है।

विकल्प 2

के रूप में अन्य लोगों ने बताया है और के रूप में मैं अपने आप को इन दिनों के और अधिक कर रहा हूँ, उपयोग विशेषता मार्ग:

[HttpGet] 
    [GET("SomeController/SomeUrlSegment/{someParameter}")] 
    public int SomeUrlSegment(string someParameter) 
    { 
     //do stuff 
    } 

मैं इस काम करने के लिए मार्ग विशेषता के लिए एक NuGet पैकेज की जरूरत (केवल "विशेषता रूटिंग" के लिए NuGet खोजें), लेकिन मुझे लगता है कि एमवीसी 5/वेबएपीआई 2 में यह मूल रूप से है।

उम्मीद है कि इससे मदद मिलती है।

+0

के लिए nuget की जांच करनी पड़ सकती है, मैंने आपके जैसे जीईटी का उपयोग करने का प्रयास किया है, लेकिन मेरे पास यह संदेश है 'त्रुटि प्रकार या नामस्थान नाम' GET 'नहीं मिला (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) ' –

+0

क्या आपने NuGet पैकेजों को रूट करने के लिए कोई विशेषता डाउनलोड की है? –

+0

नहीं मैंने नहीं किया। मैंने अभी डिफ़ॉल्ट सेटिंग्स के साथ प्रोजेक्ट बनाया है। आप डाउनलोड करने के लिए क्या सुझाव देते हैं? –

1

पहले webapiconfig.cs को

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

अब आप इस

[HttpPost] 
    public void Upload() 
    { 
      //Do some thing 
    } 

मैं विशेषता httppost साथ अपलोड कार्रवाई सजाया मतलब यह है कि इस कार्रवाई सिर्फ स्वीकार की तरह अपने नियंत्रकों के कार्यों में जोड़ सकते हैं इस मार्ग रखो पोस्ट अनुरोध, यदि आप कार्यों को प्राप्त करना चाहते हैं, तो आप विशेषता को हटा सकते हैं या बस अपने सूट

संबंधित मुद्दे