在ASP.Net Web API中,你如何伪造PUT和DELETE?
问题描述:
我正在尝试使用ASP.Net Web API,它按照惯例将控制器方法拆分为Get(),Put,Post和Delete的Restful风格。我的问题是,如何处理可能来自非Ajax浏览器请求的PUT和DELETE请求。在ASP.Net Web API中,你如何伪造PUT和DELETE?
所以,让我们说,我有一个ID foobar的= 123.正常读取请求将
/foobars/123
要删除的项目,RESTful方式将发行:
DELETE /foobars/123
但是,如果您的请求来自非Ajax浏览器请求,PUT
和DELETE
不是浏览器标准,并且没有足够的主要浏览器支持来信任。因此,一个共同接受的解决方法是:
POST /foobars/123?_method=DELETE (source: Restful Web Services)
对于新的ASP.Net的Web API,是有这个问题的工作最佳实践/常用的方法?我想要的是任何有_method=DELETE
的路由到控制器的DELETE()
方法和_method=PUT
路由到控制器的PUT()方法。
答
您可以使用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。
否...查询字符串是您要发布到的URL的一部分。 – Aliostad
Aliostad是一个很好的观点。这不应该被接受的答案,因为它引入了一个危险的安全漏洞。有人可能会向(非技术)用户发送链接'“/ delete/thing/23?_method = delete”',他们会不经意地删除“thing 23”。 正确的答案是使用“Request.Form [”_ method“]”,这将确保参数只能作为POST请求传递,而不是GET GETParam。 – Jansky