4

我正在试验 ASP.Net Web API,按照惯例,它将控制器方法拆分为 Restful 风格的 Get()、Put、Post 和 Delete。我的问题是如何处理可能来自非 Ajax 浏览器请求的 PUT 和 DELETE 请求。

所以,假设我有 id = 123 的 foobar。正常的获取请求是

/foobars/123

要删除该项目,Restful 方法是发出:

DELETE /foobars/123

但是,如果您的请求来自非 Ajax 浏览器请求PUTDELETE则它们不是浏览器标准,并且没有足够的主要浏览器支持值得信任。所以一个普遍接受的解决方法是:

POST /foobars/123?_method=DELETE (source: Restful Web Services)

对于新的 ASP.Net Web API,是否有解决此问题的最佳实践/通用方法?我想要的是任何带有 a 的东西都_method=DELETE被路由到DELETE()控制器中的方法并被_method=PUT路由到控制器的 PUT() 方法。

4

1 回答 1

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);
    }
}

然后将处理程序添加到管道中。我有一个博客

于 2012-06-26T21:37:59.207 回答