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

zs2*_*020 10 c# routing asp.net-mvc-4 asp.net-web-api

以下是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) }
);
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

public class MyController : ApiController {
    [HttpPut]
    public void Put()
    {
        //blah
    }
}
Run Code Online (Sandbox Code Playgroud)

不知何故,当客户端使用URL发送PUT请求时/api/myController/12345,它仍然映射到Put方法中MyController,我期待像资源未找到的错误.

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

提前致谢!

Der*_*ick 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) }
   );

   ...

}
Run Code Online (Sandbox Code Playgroud)

  • 这个代码示例对我有用,除了我必须指定问题中显示的约束,即:constraints:new {httpMethod = new HttpMethodConstraint(HttpMethod.Get)} (2认同)
  • .net 4.5.1 中有两个 HttpMethodConstraint 类。一个在 System.Web.Routing 中,另一个在 System.Web.Http.Routing 中。它们需要不同的参数模式,一个接受字符串,另一个查找枚举。我还不知道他们是否有除此之外的不同行为。 (2认同)

Aar*_*ght 9

你正在httpMethod制约你的约束defaults,但它应该在constraints.

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

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