如何在路由中定义 PUT 方法仅限制为控制器中的 Put 方法而不使用参数?

Posted

技术标签:

【中文标题】如何在路由中定义 PUT 方法仅限制为控制器中的 Put 方法而不使用参数?【英文标题】:How to define the PUT method in routing only limit to the Put methods in controller without parameter? 【发布时间】:2012-09-18 13:16:19 【问题描述】:

这里是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 请求时,它仍然映射到 MyController 中的 Put 方法,我预计会出现资源未找到之类的错误。

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

提前致谢!

【问题讨论】:

【参考方案1】:

这可以限制路由上的 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) 
   );

   ...


【讨论】:

这个代码示例对我有用,除了我必须指定问题中所示的约束,即:约束:新 httpMethod = new HttpMethodConstraint(HttpMethod.Get) .net 4.5.1 中有两个 HttpMethodConstraint 类。一个在 System.Web.Routing 中,另一个在 System.Web.Http.Routing 中。它们需要不同的参数模式,一种接受字符串,另一种寻找枚举。我还不知道他们是否还有其他不同的行为。 @Rozwel 谢谢!由于我使用的是 system.web.routing 而不是 system.web.http.routing。【参考方案2】:

您将httpMethod 约束放入defaults,但它应该在constraints 中。

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

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

【讨论】:

以上是关于如何在路由中定义 PUT 方法仅限制为控制器中的 Put 方法而不使用参数?的主要内容,如果未能解决你的问题,请参考以下文章

此路由不支持 PUT 方法。支持的方法:GET、HEAD、POST。在 laravel 中

如何将输入限制为仅接受数字?

如何仅保护我的控制器的特定路由?

C# Web API 405 方法没有路由到我的 PUT,总是点击我的 GET

MVC 框架中的路由器(Router)是如何跑起来的

如何使用 Mongoose 在 AngularJS 中创建 PUT 函数