我正在试验 ASP.Net Web API,按照惯例,它将 Controller 方法拆分为 Get()、Put、Post 和 Delete 的 Restful 风格。我的问题是如何处理可能来自非 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()
Controller 中的方法和 _method=PUT
路由到 Controller 的 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在那。
关于rest - 在 ASP.Net Web API 中,如何伪造 PUT 和 DELETE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213905/