0

コンソール アプリケーションでホストしているサービスを作成しています。サービスからデータを取得する 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 (1​​10 kB)

これは、サービス定義を含む DLL、コンソール ホスト、および WinForms UI クライアントの 3 つのプロジェクトで構成されています。これは、実際のアプリケーションでの設定を複製したものですが、このテストははるかに単純です。このソリューションは、複数のプロジェクトを開始するように設定されているため、簡単にテストできます。

WCF.Host アプリケーションは、net.tcp://localhost:5000/singleserviceでリッスンするホストを作成し ます UI クライアントで、[ GetObjects ] をクリックします。これにより、サービスホストへのチャネルが作成され、その上でGetObjects()メソッドが呼び出されます。ここで、UI アプリケーションを終了し、コンソール ウィンドウにトレース出力が表示されることに注意してください。

これが発生する理由、および/またはコードで例外を処理する方法を誰かが見ることができますか?

4

1 に答える 1

1

wcf クライアント アプリケーション (WCF.ClientUI) でサービス オブジェクトへの参照を保持しています。そのため、クライアント プロセスを終了する前にチャネルを閉じる必要があります。次のコードをクライアントに追加すると、クライアント アプリケーションを閉じても例外が発生しなくなります。

    protected override void OnClosing(CancelEventArgs e)
    {
        base.OnClosing(e);
        ((IChannel)service).Close();
    }
于 2013-06-12T12:00:12.403 に答える