2012-09-26 5 views
10

Oto konfiguracja routingu w WebApiConfig.cs:Jak zdefiniować metodę PUT w routingu ograniczać się tylko do metod Put w kontrolerze bez parametru?

config.Routes.MapHttpRoute(
    name: "DefaultApiPut", 
    routeTemplate: "api/{controller}", 
    defaults: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) } 
); 


config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Delete) } 
); 

Oto mój kontroler:

public class MyController : ApiController { 
    [HttpPut] 
    public void Put() 
    { 
     //blah 
    } 
} 

Jakoś gdy on- ków klienta żądanie PUT z adresem URL /api/myController/12345, to nadal są odwzorowywane na Put metoda w MyController, Spodziewam się błędu, takiego jak nie znaleziono zasobu.

Jak wymusić metodę Put akceptować tylko żądania bez parametru?

Z góry dziękuję!

Odpowiedz

9

Wprowadzasz ograniczeniedo defaults, ale powinno to być constraints.

defaults mówi tylko, jakie będą wartości domyślne, jeśli żądanie nie zawiera niektórych lub wszystkich z nich jako parametrów routingu (co w przypadku czasownika jest bez znaczenia, ponieważ każde żądanie HTTP zawsze ma czasownik jako część protokołu). constraints Ogranicz kombinację wartości tras, które aktywują trasę, co faktycznie chcesz wykonać.

Do tej prostej/standardowej trasy nie potrzebujesz atrybutu [HttpPut] w kontrolerze API. To już jest obsługiwane przez routing HTTP, który odwzorowuje czasownik na metodę kontrolera.

10

Działa to ograniczyć metodę HTTP na trasach:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
    config.Routes.MapHttpRoute(
     name: "LocationApiPOST", 
     routeTemplate: "api/{orgname}/{fleetname}/vehicle/location", 
     defaults: new { controller = "location" } 
     constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) } 
    ); 

    config.Routes.MapHttpRoute(
     name: "LocationApiGET", 
     routeTemplate: "api/{orgname}/{fleetname}/{vehiclename}/location/{start}", 
     defaults: new { controller = "location", start = RouteParameter.Optional } 
     constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } 
    ); 

    ... 

} 
+2

Ten przykładowy kod pracował dla mnie chyba, że ​​miałem do określenia ograniczeń, jak pokazano na pytanie, a mianowicie: Ograniczenia: nowy {httpMethod = new HttpMethodConstraint (HttpMethod .Get)} –

+1

Istnieją dwie klasy HttpMethodConstraint w .net 4.5.1. Jeden w System.Web.Routing, a drugi w System.Web.Http.Routing. Wymagają różnych wzorców parametrów, jeden akceptuje ciągi znaków, drugi szuka wyliczenia. Nie wiem jeszcze, czy mają inne zachowania poza tym. – Rozwel

+0

@Rozwel dzięki! Uderzyłem głową trochę, nie mogąc przekonwertować błędu na string, ponieważ używałem system.web.routing not system.web.http.routing. – Matt