2012-04-30 101 views
0

我正在使用新的MVC4 ASP.Net Web API系統。ASP.Net Web API - 遠程服務器返回錯誤:(405)方法不允許

我在使用WebClient的測試項目中調用我的API。如果我使用GET或POST,它工作正常。如果我使用其他任何東西,我會得到方法不允許的。我實際上是通過注入以下標題來「僞造」該方法。我這樣做是因爲我的最終用戶由於某些防火牆的限制也必須這樣做。

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

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

我試圖在IIS調整腳本映射,但由於沒有擴展,我不知道我的意思進行調整!

任何想法? 問候 尼克

+0

你是如何在你的控制器中定義你的方法的?在你的問題中顯示這將有助於提供答案。你在方法(s)上使用了屬性[HttpPut]嗎? –

+0

我的確做到了 - [HttpPut] – nickthompson

+0

其實,我意識到它是由X-HTTP-Method頭引起的。如果我使用WebRequest並將我的「Method」設置爲「PUT」,則它工作正常。所以現在我更困惑了! – nickthompson

回答

7

X-HTTP-Method(或X-HTTP-Method-Override)頭不受Web API支持開箱即用。您需要創建一個自定義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); 
    } 
} 

現在你只需要註冊您的DelegatingHandlerGlobal.asax

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

這應該是訣竅。

+0

工作 - 謝謝! – nickthompson

相關問題