3

同じマシンで二重の WCF サービスとクライアントを実行しています。クライアントは 15 秒のタイムアウトを持つように構成されています。

<binding name="NetTcpBinding_IServiceIPC" closeTimeout="00:00:15"
      openTimeout="00:00:15" receiveTimeout="00:00:15" sendTimeout="00:00:15" />

クライアントは次のような障害を処理しています。

client.InnerChannel.Faulted += FaultHandler;
client.InnerDuplexChannel.Faulted += FaultHandler;
client.ChannelFactory.Faulted += FaultHandler;

Service プロセスを強制終了すると、クライアントはTimeoutException15 秒後に正しく取得します。

This request operation sent to net.tcp://localhost:8732/Service/ did not receive a reply within the configured timeout (00:00:15).  The time allotted to this operation may have been a portion of a longer timeout.  This may be because the service is still processing the operation or because the service was unable to send a reply message.  Please consider increasing the operation timeout (by casting the channel/proxy to IContextChannel and setting the OperationTimeout property) and ensure that the service is able to connect to the client. (System.TimeoutException)

ただし、この時点ではチャネルに障害は発生していません。Service プロセスを強制終了してから約 5 分後まで、フォルト ハンドラが呼び出されません。TimeoutExceptionチャンネルに障害があると思いましたが(この回答を参照)、どういうわけかそうではないようです。サービスプロセスが強制終了された後、チャネルをより迅速に障害状態にする方法はありますか?

4

2 に答える 2

4

この質問Duplex channel Faulted event は、2 回目の接続試行で発生しません。このFaultedイベントは常に発生するとは限りません。また、MSDN の WCF 状態フロー図は、その可能性を確認しています - http://msdn.microsoft.com/en-us/library/ms789041.aspx

障害状態を経由しないクローズド状態への多くのパスがあります。ほとんどの場合、タイムアウト時にAbort()メソッドが呼び出され、faulted 状態を経由せずに open 状態から Closing 状態に移行します。ロギングを追加して、実行中の状態を確認します。タイムアウト後にチャネルを再開しようとしている場合は、5 分後に障害状態になる理由を説明できます。より大きな問題を解決するには、ロジックをFaultedHandler他の場所に移動して、他のパスを介してクローズ状態に達したときに実行されるようにします。

于 2012-11-15T18:48:43.293 に答える