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 バインディングを使用しても問題を再現できませんでした。