私がやろうとしているのは、複数のクライアントが登録する wcf 二重サービスを用意することです。クライアントがサービスを呼び出すと、他のクライアントに呼び出しが通知されます。
現在、wcf 二重サービスを呼び出す Silverlight アプリがあります。最初の通話では、二重通信を含め、すべてが正しく機能しています。サービスへの 2 回目の呼び出しで、次のメッセージが表示されます。
The communication object, System.ServiceModel.Channels.ClientPollingDuplexSessionChannel, cannot be used for communication because it is in the Faulted state.
私のサービスには 2 つの異なる方法があります。RegisterClient と ReassignOwner。同じメソッドを 2 回、または両方のメソッドを任意の順序で 1 回呼び出すと、まだこのエラーが発生します。
この件について調査した後、タイムアウトの問題である可能性があると思いました。デフォルトのタイムアウト値を確認したところ、10 分です。私は 2 ~ 3 分以内に両方の通話を行います。念のため、非アクティブ タイムアウトと受信タイムアウトを 4 時間に増やしましたが、まだこの問題が発生しています。
次に、サービスが例外を生成し、クライアントが障害状態になる可能性があると考えました。これをテストするために、サービスの 2 つのメソッドに try/catch ステートメントを配置し、プログラムをデバッグ モードで実行しました。私は例外をキャッチしませんでした。また、これら2つのメソッドのすべてのコードをコメントアウトして(例外を生成できないように)、これら2つの空のメソッドを呼び出してみましたが、それでも例外が発生しました。
SO に関する他の関連記事を読んで、WCF トレースを試すことにしました。web.config で有効にし、スイッチの値を警告に設定しました。2 つの警告が表示されます。
Description Faulted System.ServiceModel.Channels.ServicePollingDuplexSessionChannel
Description Faulted System.ServiceModel.Channels.ServiceChannel
コード ビハインド .svc.cs ファイルでサービスを定義する方法を次に示します。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, AutomaticSessionShutdown = false)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class NotificationService : BaseService, INotificationDuplexService
私のサービス コントラクトでは、両方のメソッドに次の属性があります。
[OperationContract(AsyncPattern = true, IsOneWay = true,
Action = "http://www.abc.org/NotificationDuplex/INotificationDuplexService/MethodName")]
どちらのメソッドも、Begin メソッドと End メソッドを使用して非同期方式で実装されています。
メソッドを呼び出す方法は次のとおりです
base.InvokeAsync(this.onBeginRegisterClientDelegate, new object[] {
id}, this.onEndRegisterClientDelegate, this.onRegisterClientCompletedDelegate, userState);
なぜこれが起こっているのか、またはこの問題を解決しようとする方法の手がかりを知っている人はいますか?