【问题标题】:Web Api always accept POST verb on controller methodsWeb Api 始终接受控制器方法上的 POST 动词
【发布时间】:2017-08-03 20:37:10
【问题描述】:

带有动作名称的路由,例如:

config.Routes.MapHttpRoute(
    name: "ByActionName",
    routeTemplate: "api/{controller}/{action}");

我希望我的所有控制器方法都接受 POST 动词,有没有办法配置路由映射,这样我就不需要为所有控制器方法添加 HttpPost 属性?

我希望做类似的事情:

config.Routes.MapHttpRoute(
    name: "ByActionName",
    verb: "POST"
    routeTemplate: "api/{controller}/{action}");

代替:

public class MyController: ApiController
 {
     [HttpPost]
     public List<int> GetItems() { ... } 

     [HttpPost]
     public void DeleteItem(int id) { ... }

     [HttpPost]
     public void OtherMethod() { ... }
 }

【问题讨论】:

    标签: asp.net post routing asp.net-web-api2 rpc


    【解决方案1】:

    如果方法名称以 Get、Delete 等动词开头,则默认动词将与之匹配。如果方法名的开头不匹配任何动词,webapi 默认为 HttpPost。因此,您可以通过重命名控制器方法来避免放置 [HttpPost] 属性。

    见:Is there a default verb applied to a Web API ApiController method?

    【讨论】:

    • 但是最好有办法告诉路由器始终允许,例如POST 动词,虽然该方法名为 Get...,但在您开发的不是 REST api 而是更 rpc 风格的 api 的情况下。
    • @Anttu 无论您如何命名您的方法,您都可以随时添加[HttpPost] 属性以允许 POST 操作。您还可以创建自己的自定义 Route 类型以始终允许 POST 操作。所以你在这里肯定有选择和灵活性。但是您确实需要单独装饰控制器中的每个方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多