【问题标题】:ASP.Net Web API Route based on HTTP Method基于 HTTP 方法的 ASP.Net Web API 路由
【发布时间】:2015-10-06 02:23:18
【问题描述】:

有没有办法根据请求中指定的HTTP方法进行路由?我希望在同一个 URI 上有一个 GET 和 PUT,但我似乎找不到在两者之间设置路由的选项。 [HttpGet] 和 [HttpPut] 属性仅充当过滤器,因此 PUT 请求会触发第一个操作,并且由于它首先触发 GET 处理程序而出现 405 错误。

我想做什么
~/User/PP GET -> UserController.GetPrivacyPolicy
~/User/PP PUT -> UserController.UpdateUserPrivacyPolicy

目前正在发生的事情
~/User/PP GET -> UserController.GetPrivacyPolicy
~/User/PP PUT -> UserController.GetPrivacyPolicy
(这个错误是因为我在 GetPrivacyPolicy 方法上有一个 [HttpGet] 过滤器)

更新: 只是为了补充下面发布的内容,看起来我误解了 [HttpGet] 和 [HttpPut] 属性的工作原理,它们是路由过程的一部分。我能够通过以下方式达到我想要的结果

    [HttpGet]
    [Route("~/User/PP")]
    public string GetPrivacyPolicy()
    {
        return "Get PP";
    }
    [HttpPut]
    [Route("~/User/PP")]
    public void UpdatePrivacyPolicy()
    {
        return "Put PP";
    }

【问题讨论】:

    标签: asp.net-web-api2


    【解决方案1】:

    您需要做的是使用同名操作创建控制器,但使用不同的 Http 方法属性进行装饰

    public class UserController : Controller {
    
        [HttpGet]
        public ActionResult PrivacyPolicy(int id) {
            // Put your code for GetPrivacyPolicy here
        }
    
        [HttpPut]
        public ActionResult PrivacyPolicy(int id, YourViewModel model) {
            // Put your code for UpdatePrivacyPolicy here
        }
    
    }
    

    当然,其他方法也有适当的操作,例如HttpPost, HttpDelete, HttpPatch.

    【讨论】:

    • 属性仅充当过滤器,您所做的是重载了 PrivacyPolicy 方法。我可以做到这一点,但我实际上并没有将任何参数传递给操作。
    • 好吧等等,也许我错了...属性确实是路由的一部分。
    • 是的,它们的工作方式与您正常的重载方法略有不同。尝试POSTing 只需一个 id,你会得到一个不错的小 404。
    猜你喜欢
    • 2023-03-22
    • 2017-11-20
    • 2020-05-27
    • 2018-06-14
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多