我正在使用新的MVC4 ASP.Net Web API系统。
我使用WebClient在测试项目中调用我的API。如果我使用GET或POST,它可以正常工作。如果我使用其他任何东西,我会得到Method Not Allowed。我实际上是通过注入以下标题来“伪造”该方法。我这样做是因为由于某些防火墙的限制,我的最终用户也必须这样做。
我通过IIS调用URL(即不是cassini) - 例如http://localhost/MyAPI/api/Test
wc.Headers.Add("X-HTTP-Method", "PUT");
我尝试在IIS中调整脚本映射,但由于没有扩展名,我不知道我要调整的是什么!
有什么想法吗? 问候 尼克
答案 0 :(得分:7)
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);
}
}
现在您只需在DelegatingHandler
注册Global.asax
:
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configuration.MessageHandlers.Add(new XHttpMethodDelegatingHandler());
...
}
这应该可以解决问题。