我正在尝试使用ASP.Net Web API,按照惯例,它将控制器方法拆分为Restful样式的Get(),Put,Post和Delete。我的问题是如何处理可能来自非Ajax浏览器请求的PUT和DELETE请求。
所以,让我们说我有一个id = 123的foobar。正常的提取请求将是
/foobars/123
要删除该项目,Restful方式将发出:
DELETE /foobars/123
但是,PUT
和DELETE
不是浏览器标准,如果您的请求来自非Ajax浏览器请求,则没有足够的主要浏览器支持可信任。因此,一个常见的解决方法是:
POST /foobars/123?_method=DELETE (source: Restful Web Services)
对于新的ASP.Net Web API,是否有最佳实践/常用方法来处理此问题?我想要的是将_method=DELETE
路由到控制器中的DELETE()
方法并将_method=PUT
路由到控制器的PUT()方法。
答案 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。