如何定义路由中的PUT方法仅限于没有参数的控制器中的Put方法?

以下是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 /api/myController/12345发出PUT请求时,它仍然映射到MyControllerPut方法,我预计会出现类似资源的错误。

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

提前致谢!

您将httpMethod约束置于defaults ,但它应该在constraints

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

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

这适用于约束路由上的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) } ); ... }