【问题标题】:In ASP.Net Web API, how do you fake PUT and DELETE?在 ASP.Net Web API 中,如何伪造 PUT 和 DELETE?
【发布时间】:2012-06-28 03:48:43
【问题描述】:

我正在尝试使用 ASP.Net Web API,按照惯例,它将控制器方法拆分为 Restful 风格的 Get()、Put、Post 和 Delete。我的问题是如何处理可能来自非 Ajax 浏览器请求的 PUT 和 DELETE 请求。

所以,假设我有 id = 123 的 foobar。正常的获取请求是

/foobars/123

要删除项目,Restful 方式是发出:

DELETE /foobars/123

但是,PUTDELETE 不是浏览器标准,如果您的请求来自非 Ajax 浏览器请求,则它们没有足够的主要浏览器支持值得信赖。因此,一个普遍接受的解决方法是:

POST /foobars/123?_method=DELETE (source: Restful Web Services)

对于新的 ASP.Net Web API,是否有解决此问题的最佳实践/通用方法?我想要的是将带有_method=DELETE 的任何东西路由到控制器中的DELETE() 方法,并将_method=PUT 路由到控制器的PUT() 方法。

【问题讨论】:

    标签: rest asp.net-web-api http-delete http-put


    【解决方案1】:

    您可以使用DelegatingHandler 轻松实现此目的。

    所以你会编码:

    public class HttpMethodHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var queryString = HttpUtility.ParseQueryString(request.RequestUri.Query);
            if(!string.IsNullOrEmpty(queryString["_method"]))
            {
                request.Method = new HttpMethod(queryString["_method"]);
            }
            return base.SendAsync(request, cancellationToken);
        }
    }
    

    然后将处理程序添加到管道中。我有一个blog

    【讨论】:

    • Aliostad 提出了一个很好的观点。这不应该是公认的答案,因为它引入了危险的安全漏洞。有人可以向(非技术)用户发送链接"/delete/thing/23?_method=delete",他们会在不知情的情况下删除“thing 23”,而无需做出选择。正确的答案是使用“Request.Form[”_method“]”,这将确保参数只能作为 POST 请求而不是 GET 查询参数传递。
    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 2012-07-29
    • 2012-09-13
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多