0

我正在使用新的 MVC4 ASP.Net Web API 系统。

我在使用 WebClient 的测试项目中调用我的 API。如果我使用 GET 或 POST,它工作正常。如果我使用其他任何东西,我会得到 Method Not Allowed。我实际上是通过注入以下标头来“伪造”该方法。我这样做是因为由于某些防火墙的限制,我的最终用户也必须这样做。

我通过 IIS(即不是 cassini)调用 URL - 例如http://localhost/MyAPI/api/Test

wc.Headers.Add("X-HTTP-Method", "PUT");

我尝试在 IIS 中调整脚本映射,但由于没有扩展,我不知道我要调整什么!

有任何想法吗?问候尼克

4

1 回答 1

7

Web API 不支持开箱即用的X-HTTP-Method(or ) 标头。X-HTTP-Method-Override您将需要创建一个自定义DelegatingHandler(以下实现假设您使用POST应有的方法提出请求):

public class XHttpMethodDelegatingHandler : DelegatingHandler
{
    private static readonly string[] _allowedHttpMethods = { "PUT", "DELETE" };
    private static readonly string _httpMethodHeader = "X-HTTP-Method";

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Method == HttpMethod.Post && request.Headers.Contains(_httpMethodHeader))
        {
            string httpMethod = request.Headers.GetValues(_httpMethodHeader).FirstOrDefault();
            if (_allowedHttpMethods.Contains(httpMethod, StringComparer.InvariantCultureIgnoreCase))
            request.Method = new HttpMethod(httpMethod);
        }
        return base.SendAsync(request, cancellationToken);
    }
}

现在您只需要注册您的DelegatingHandlerin Global.asax

protected void Application_Start(object sender, EventArgs e)
{
    GlobalConfiguration.Configuration.MessageHandlers.Add(new XHttpMethodDelegatingHandler());
    ...
}

这应该可以解决问题。

于 2012-04-30T13:44:07.293 回答