在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浏览器请求,PUTDELETE不是浏览器标准,并且没有足够的主要浏览器支持来信任。因此,一个共同接受的解决方法是:

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

+1

否...查询字符串是您要发布到的URL的一部分。 – Aliostad

+0

Aliostad是一个很好的观点。这不应该被接受的答案,因为它引入了一个危险的安全漏洞。有人可能会向(非技术)用户发送链接'“/ delete/thing/23?_method = delete”',他们会不经意地删除“thing 23”。 正确的答案是使用“Request.Form [”_ method“]”,这将确保参数只能作为POST请求传递,而不是GET GETParam。 – Jansky