4

IIS 7.5 (Windows Server 2008 R2) でホストされている CLR 4 WCF サービスを使用しており、WebHttp バインディング (を使用) を使用してい[WebGet]ます。サービスは、C++ (Visual Studio 2010) で実装されたアンマネージ コンポーネントを呼び出します。

ダンプ ファイルの生成設定をテストするために、意図的にアンマネージ コンポーネント内にアクセス違反を追加しました (deleteポインターを繰り返し呼び出す、削除されたポインターを介してメソッドを呼び出すなど)。アクセス違反により w3wp.exe プロセスがクラッシュしますが、これは CLR 4 の「破損状態の例外」を考えると驚くべきことではありません。ただし、プロセスが再起動すると (IIS のウォームアップと常時オンの設定により)、同じ要求が再生されるようです。 w3wp.exe プロセスが再びクラッシュするようにサービスに接続します。数回 (「最大失敗」アプリケーション プール設定によって制御される) 後、アプリケーション プールは停止します。

ブラウザをテスト クライアントとして使用していますが、再起動シーケンスが進行中の間、リクエストはまだ処理中です。アプリケーション プールが停止すると、要求は で返され503 Service Unavailableます。

try...catchコードの周りにブロックを配置し、[HandleProcessCorruptedStateExceptions]属性を使用することで、問題を回避できます。これを行うと、w3wp.exe プロセスはクラッシュしません。ただし、これは望ましい動作ではありません。プロセスをクラッシュさせたいのですが (アクセス違反やメモリの破損は十分に悪いことです)、プロセスをクリーンな状態に再起動し、要求をリプレイさせないようにしたいのです。

BasicHttp バインディングを使用しても問題を再現できませんでした。

4

1 に答える 1

0

これが HTTP.sys の仕組みです (下位レベルで http 要求を処理するカーネル ドライバー)。プール/サーバーがバックアップされた後、要求をキューに入れ、IIS に送信します。

于 2015-05-04T17:08:15.210 に答える