わかりました、コードから奇妙な例外がスローされ、何年も悩まされてきました。
System.Net.Sockets.SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall
at System.Net.Sockets.Socket.Accept()
at System.Net.Sockets.TcpListener.AcceptTcpClient()
MSDN はこれに関してあまり役に立ちません: http://msdn.microsoft.com/en-us/library/ms741547(VS.85).aspxそして、この問題のトラブルシューティングを開始する方法さえ知りません。1 日に 4 ~ 5 回しかスローされず、テスト環境では一度もスローされません。本番サイトのみ、およびすべての本番サイトで。
この例外について尋ねる投稿がたくさん見つかりましたが、何が原因で、どのように処理または防止するかについての実際の決定的な回答はありません。
コードは別のバックグラウンド スレッドで実行され、メソッドが開始されます。
public virtual void Startup()
{
TcpListener serverSocket= new TcpListener(new IPEndPoint(bindAddress, port));
serverSocket.Start();
次に、すべての新しい接続をジョブとして別のスレッド プールに配置するループを実行します。アプリのアーキテクチャが原因でさらに複雑になりますが、基本的には次のとおりです。
while (( socket = serverSocket.AcceptTcpClient()) !=null) //Funny exception here
{
connectionHandler = new ConnectionHandler(socket, mappingStrategy);
pool.AddJob(connectionHandler);
}
}
そこから、pool
独自のスレッドで各ジョブを個別に処理する独自のスレッドがあります。
私の理解では、AcceptTcpClient() はブロッキング呼び出しであり、何らかの方法で winsock がスレッドにブロッキングを停止して実行を継続するように指示しています..しかし、なぜですか? そして、私は何をすべきですか?例外をキャッチして無視するだけですか?
まあ、他のスレッドがソケットを閉じていると思いますが、それは確かに私のコードからのものではありません。私が知りたいのは、このソケットは接続しているクライアント (ソケットの反対側) によって閉じられているのか、サーバーによって閉じられているのかということです。現時点では、この例外が発生するたびに、リッスン ポートがシャットダウンされ、サービスが効果的に閉じられるためです。これが遠隔地から行われる場合、それは大きな問題です。
あるいは、単に IIS サーバーがアプリケーションをシャットダウンし、すべてのバックグラウンド スレッドとブロック メソッドをキャンセルしただけでしょうか?