コンソール アプリケーションでホストしているサービスを作成しています。サービスからデータを取得する 1 つのメソッドと、サーバー上で実行できるいくつかのメソッドが含まれています。
サービスをテストするために、サービスに接続してホスト上の操作を呼び出す単純な WinForms アプリケーションを作成しました。これは問題なく動作しているように見えますが、構成ファイルにサービス トレースを追加して何が起こっているかを確認したところ、UI クライアントを閉じるとすぐにサービス側で例外がスローされることに気付きました。
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error">
<TraceIdentifier>http://msdn.microsoft.com/nb-NO/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier>
<Description>Throwing an exception.</Description>
<AppDomain>WCF.Host.vshost.exe</AppDomain>
<Exception>
<ExceptionType>System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>
An existing connection was forcibly closedby the remote host
</Message>
<StackTrace>
at System.ServiceModel.Channels.SocketConnection.HandleReceiveAsyncCompleted() at System.ServiceModel.Channels.SocketConnection.OnReceiveAsync(Object sender, SocketAsyncEventArgs eventArgs) at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationAsyncFailure(SocketError socketError, Int32 bytesTransferred, SocketFlags flags) at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
</StackTrace>
<ExceptionString>
System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host
</ExceptionString>
<NativeErrorCode>2746</NativeErrorCode>
</Exception>
</TraceRecord>
(ConsoleTraceListener を設定に追加して、警告が発生したらすぐに確認できるようにしました。)
これが発生しても、私が知る限り、サーバー側には影響しません。サービスをホストするコンソール アプリケーションで例外がスローされることはありません。また、UI クライアントを再起動すると、ホストに対して操作を実行できます。
それでも、これは、処理できるようにホスト側でキャッチしたい例外です。私の意見では、トレース ログ内の例外の兆候を調査する必要がありますが、コード内のどこでこのエラーを検出できるかを単純に理解できません。チャネルの Closed および Faulted イベントはまったく発生していないようです。
ここでダウンロードできるこの VS 2012 ソリューションで問題を再現しました: http://db.tt/7l2Dnkpr (110 kB)
これは、サービス定義を含む DLL、コンソール ホスト、および WinForms UI クライアントの 3 つのプロジェクトで構成されています。これは、実際のアプリケーションでの設定を複製したものですが、このテストははるかに単純です。このソリューションは、複数のプロジェクトを開始するように設定されているため、簡単にテストできます。
WCF.Host アプリケーションは、net.tcp://localhost:5000/singleserviceでリッスンするホストを作成し ます UI クライアントで、[ GetObjects ] をクリックします。これにより、サービスホストへのチャネルが作成され、その上でGetObjects()メソッドが呼び出されます。ここで、UI アプリケーションを終了し、コンソール ウィンドウにトレース出力が表示されることに注意してください。
これが発生する理由、および/またはコードで例外を処理する方法を誰かが見ることができますか?