2012-09-26 13 views
10

Aquí está la configuración de enrutamiento en WebApiConfig.cs:¿Cómo se define el método PUT en el límite de enrutamiento solo para los métodos Put en el controlador sin parámetro?

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

Aquí está mi controlador:

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

alguna manera, cuando los clientes senta la solicitud PUT con la URL /api/myController/12345, todavía se asigna al Put método en MyController, estoy esperando un error como recurso no encontrado.

¿Cómo forzar el método Put solo aceptar la solicitud sin un parámetro?

¡Gracias de antemano!

Respuesta

9

Está poniendo su restricción httpMethod en defaults, pero debería estar en constraints.

defaults acaba de decir cuáles serán los valores predeterminados si la solicitud no incluye algunos o todos ellos como parámetros de enrutamiento (que en el caso del verbo, no tiene sentido, ya que cada solicitud HTTP siempre tiene un verbo como parte del protocolo). constraints limita la combinación de valores de ruta que activarán la ruta, que es lo que realmente estás tratando de hacer.

FYI, para este enrutamiento simple/estándar, tampoco necesita el atributo [HttpPut] en un controlador API. Eso ya es manejado por el enrutamiento HTTP que mapea el verbo al método del controlador.

10

Esto funciona para limitar método HTTP en las rutas:

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

Este código de ejemplo trabajado para mí, excepto que tenía que especificar restricciones como se muestra en la cuestión, es decir: las limitaciones: nueva {HTTPMethod = new HttpMethodConstraint (HTTPMethod .Obtener)} –

+1

Hay dos clases HttpMethodConstraint en .net 4.5.1. Uno en System.Web.Routing y el otro en System.Web.Http.Routing. Requieren diferentes patrones de parámetros, uno acepta cadenas, el otro busca la enumeración. Aún no sé si tienen comportamientos diferentes más allá de eso. – Rozwel

+0

@Rozwel gracias! Me estaba golpeando un poco la cabeza y no puedo convertir el error de cadena porque estaba usando system.web.routing not system.web.http.routing. – Matt

Cuestiones relacionadas