Asp.net mvc 4 ASP.Net Web API-远程服务器返回错误:(405)方法不允许

Asp.net mvc 4 ASP.Net Web API-远程服务器返回错误:(405)方法不允许,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我正在使用新的MVC4ASP.NETWebAPI系统 我正在使用WebClient在测试项目中调用API。如果我使用GET或POST,它可以正常工作。如果我使用其他任何东西,我得到的方法是不允许的。我实际上是通过注入下面的头来伪造这个方法。我这样做是因为由于某些防火墙的限制,最终用户也必须这样做 我通过IIS调用URL,即不是cassini-例如 我尝试在IIS中调整脚本映射,但由于没有扩展,我不知道我要调整什么 有什么想法吗? 当做 NickWeb API不支持开箱即用的X-HTTP-Meth

我正在使用新的MVC4ASP.NETWebAPI系统

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

我通过IIS调用URL,即不是cassini-例如

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

有什么想法吗? 当做 Nick

Web API不支持开箱即用的X-HTTP-Method或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);
    }
}

这应该可以解决问题。

您是如何在控制器中定义方法的?在你的问题中展示这一点将有助于提供答案。你在方法上使用了属性[HttpPut]吗?我确实这样做了-[HttpPut]实际上,我已经意识到它是由X-HTTP-Method头引起的。如果我使用WebRequest并将我的方法设置为PUT,它就可以正常工作。所以现在我更糊涂了!
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);
    }
}
protected void Application_Start(object sender, EventArgs e)
{
    GlobalConfiguration.Configuration.MessageHandlers.Add(new XHttpMethodDelegatingHandler());
    ...
}