2012-04-30 38 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

コントローラでどのようにメソッドを定義しましたか?これをあなたの質問に表示すると、答えが得られます。メソッドで[HttpPut]属性を使用しましたか? –

+0

私はちょうどそれをしました - [HttpPut] – nickthompson

+0

実際、私はそれがX-HTTP-Methodヘッダーによって引き起こされていることを認識しました。私がWebRequestを使用し、 "メソッド"を "PUT"に設定すると、正常に動作します。だから私はもっと混乱している! – nickthompson

答えて

7

X-HTTP-Method(又はX-HTTP-Method-Override)ヘッダは、Web APIによって、ボックスの外にサポートされていません。

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

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に登録する必要があります:あなたは(実装はあなたはそれがあるべきようPOST方法であなたの要求を行っていることを前提としてい下回っ)カスタムDelegatingHandlerを作成する必要があります

これはトリックを行う必要があります。

+0

Worked - ありがとう! – nickthompson

関連する問題