以下是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
}
}
当客户端使用网址/api/myController/12345
发送PUT请求时,它仍会映射到Put
中的MyController
方法,我预计会出现资源未找到的错误。
如何强制Put
方法只接受没有参数的请求?
提前致谢!
答案 0 :(得分: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) }
);
...
}
答案 1 :(得分:9)
您将httpMethod
约束条件加入defaults
,但它应位于constraints
。
defaults
只是说如果请求中没有包含部分或全部作为路由参数的默认值(在动词的情况下,这是无意义的,因为每个HTTP请求总是有一个动词作为协议的一部分)。 constraints
限制将激活路线的路线值组合,这正是您实际尝试做的事情。
仅供参考,对于此简单/标准路由,您也不需要API控制器中的[HttpPut]
属性。这已经由HTTP路由处理,它将动词映射到控制器方法。