在ASP.Net Web API中,你如何伪造PUT和DELETE?

时间:2012-06-26 18:39:16

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

我正在尝试使用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()方法。

1 个答案:

答案 0 :(得分:3)

您可以使用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