10

下面是 WebApiConfig.cs 中的路由配置:

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

这是我的控制器:

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

不知何故,当客户端发送带有 URL 的 PUT 请求时/api/myController/12345,它仍然映射到中的Put方法MyController,我期待一个错误,比如找不到资源。

如何强制Put方法只接受不带参数的请求?

提前致谢!

4

2 回答 2

10

这可以限制路由上的 http 方法:

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

   ...

}
于 2013-10-09T19:35:36.603 回答
9

您将httpMethod约束放入defaults,但它应该放入constraints.

defaults只是说如果请求不包含部分或全部作为路由参数时的默认值是什么(在动词的情况下,这是没有意义的,因为每个 HTTP 请求总是有一个动词作为协议的一部分)。constraints限制将激活路由的路由值组合,这是您实际尝试做的。

仅供参考,对于这种简单/标准的路由,您也不需要[HttpPut]API 控制器中的属性。这已经由将动词映射到控制器方法的 HTTP 路由处理了。

于 2012-09-27T03:41:12.577 回答