1

ResponseStreamFilterHttpResponse.Filterに適用しようとすると、IIS7 から 405 エラーと次の例外が発生します。

HttpException: 
The HTTP verb POST used to access path '/app/Thing.asmx/Command' is not allowed.

次のようなコードで HttpModule を使用してフィルターを適用しています。

var rfs = new ResponseFilterStream(HttpContext.Current.Response.Filter);
rfs.TransformStream +=
    new Func<System.IO.MemoryStream, System.IO.MemoryStream>(ProcessStream);
HttpContext.Current.Response.Filter = rfs;
Log("Response stream filter applied correctly.");

HttpModule のすべてのコードは問題なく動作します...安全のためにすべてが try-catch にラップされ、例外はスローされず、上記の最後の行のような診断ログは正しく機能しています。

しかしProcessStream、上記のコードのメソッドは呼び出されていないようです。フィルターをHttpResponse.Filterまったく適用すると、IIS はフィルターの処理を開始する前に 405 例外をスローします

私たちのコードは以前にいくつかの同様のシステムで機能していたため、この特定のサーバーの IIS/マシン構成が原因であると思われます。 何が原因でしょうか?

このような状況で最もよく報告される 405 エラーの原因は、Url.Rewrite を使用しているようです。(パス '/test.html' へのアクセスに使用される HTTP 動詞 POST は許可されていません) ただし、Url.Rewrite は使用していません。

よく報告される別の原因は、リクエスト URL の末尾のスラッシュです。( HTTP POST IIS ASP .NET のエラーで HTTP 405 ) しかし、前述のように、要求されている URL はスラッシュで終わっていません。

アプリ プールクラシック パイプラインで .NET 4.0 を実行しています ( jQuery AJAX post receive 405 error (HTTP verb POST not allowed) )。このサーバーの構成に固有のものになります。統合パイプラインに変更すると、コードがフィルタリングしているアプリケーションが破損するため、とにかく回避策はありません。

4

1 に答える 1

2

結局のところ、これは非常にあいまいな IIS のバグでした。

http://support.microsoft.com/kb/980368

ExtensionlessUrl ハンドラ ( *.) が、期待どおりに WebServiceHandlerFactory ( *.asmx) だけでなく、誤って要求に関与していました。回避策は次のとおりです。

  1. Web アプリケーションのハンドラー マッピングから ExtensionlessUrl ハンドラー エントリを手動で削除する
  2. ExtensionlessUrl ハンドラー エントリを、実際にヒットすると予想されるものの下に手動で移動する
  3. system.webServer/handlers の下に web.config エントリを追加して、必要に応じて ExtensionslessUrl ハンドラーを削除します (アプリのデプロイに確実に含まれるようにするために、このオプションを使用しました)。

合理的な時間枠でこれを理解する方法はなかったので、これについて Microsoft サポート チケットを燃やさなければなりませんでした。うまくいけば、これは他の誰かに役立ちます。

于 2013-05-08T14:03:50.267 に答える