代码之家  ›  专栏  ›  技术社区  ›  zs2020

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

  •  10
  • zs2020  · 技术社区  · 12 年前

    以下是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 ,我预计会出现类似找不到资源的错误。

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

    提前感谢!

    2 回复  |  直到 12 年前
        1
  •  10
  •   Ankit Rana Derrick    7 年前

    这可以在路由上约束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) }
       );
    
       ...
    
    }
    
        2
  •  9
  •   Aaronaught    12 年前

    你把你的 httpMethod 约束到 defaults ,但它应该在 constraints

    默认值 只是说明如果请求不包括部分或全部作为路由参数,默认值是什么(在谓词的情况下,这是没有意义的,因为每个HTTP请求都有一个谓词作为协议的一部分)。 约束 限制将激活路由的路由值的组合,这正是您实际想要做的。

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