2014-07-19 18 views
19

biz denetleyiciASP.NET WebAPI denetleyicisine özel yöntemler nasıl eklenir? Varsayılan olarak <strong>ASP.NET MVC WebAPI</strong> projede

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

aşağıdaki oluşturulan Ama onlar da/almak yazıyı destekleyebilir böylece burada herhangi bir özel yöntemleri eklemek mümkündür var?

Teşekkür ederiz!

cevap

15

Böyle Http türüyle RoutePrefix gibi nitelikleri kullanabilirsiniz.

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

http türü, rota adıyla birlikte doğru yöntemle eşleştirecektir.

+0

Merhaba! '[Route (" MyPath ")]' 'ı girmeye çalıştığımda]' 'VS2013 onu çözmez. Ayrıca hata ayıklayamıyorum. Bana [Rota ("MyPath")] 'hakkında bir hata veriyor. Sorunun ne olduğunu biliyor musun? –

+1

@ClarkKent MVC 5 ve WebApi 2'de yereldir, aksi halde, 'AttributeRouting' –

11

Sen yönlendirme özelliğini kullanabilirsiniz:

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

Bazı belgeler başlamak için:

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

+1

Merhaba! '[Route (" MyPath ")]' 'ı girmeye çalıştığımda]' 'VS2013 onu çözmez. Ayrıca hata ayıklayamıyorum. Bana [Rota ("MyPath")] 'hakkında bir hata veriyor. Sorunun ne olduğunu biliyor musun? –

+1

@ ClarkKent - "özellik yönlendirmesi" için NuGet'i ara.Muhtemelen bir DLL ya da ikiye ihtiyacınız var. –

14

Sana GET ve kodunuzda orada POST var gibi ben izleyin, ancak her durumda diğer seçenekler var emin değilim:

Seçenek 1

İlk olarak, içinde özel Yolları yapılandırabilirsiniz WebApiConfig.cs dosyasında App_Start klasörü.

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

Ben RESTful uç noktalarının kombinasyonunu yanı sıra RPC uç noktaları kullanın: Burada normalde kullandığınız yöntemdir. Bazı püristler için bu, kutsal bir savaşın gerekçesidir. Benim için, ikisinin bir kombinasyonunu kullanıyorum çünkü güçlü bir kombinasyon ve bende hiçbir akıl sebebi bulamıyorum.

Diğerleri işaret gibi

Seçenek 2

ve kendimi bugünlerde daha yapıyorum gibi kullanım nitelik yönlendirme:

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

Ben bu işi yapmak için yönlendirme özelliği için bir Nuget paketi gerekli (Sadece "Yönlendirme Yönlendirmesi" için NuGet'i ara), fakat MVC 5/WebAPI 2'nin bunu doğal olarak kullandığını düşünüyorum.

Bu yardımcı olur umarım.

+0

için nuget'i kontrol etmeliyim, GET'i kullandığınız gibi GET kullanmaya çalışıyorum ama bu iletiye sahibim' Hata Tür veya ad alanı adı GET 'bulunamadı (kullanma yönergesi veya montaj referansı eksik misiniz?) ' –

+0

NuGet paketleri yönlendirme özelliklerinden herhangi birini indirdiniz mi? –

+0

Hayır Yapmadım. Projeyi varsayılan ayarlarla yeni oluşturdum. İndirmeyi ne önerirsiniz? –

1

İlk

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

Şimdi bu eylem sadece tek kabul ettiğiniz anlamına gelir Ben nitelik HttpPost ile yükleme eylemi süslenmiş bu

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

gibi denetleyicileri eylemler ekleyebilir webapiconfig.cs için bu yolu koy GET olmak için işlem yapmak isterseniz, istekleri kaldırabilir veya yalnızca odanıza dekore edebilirsiniz.