1

私がやろうとしているのは、複数のクライアントが登録する 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);

なぜこれが起こっているのか、またはこの問題を解決しようとする方法の手がかりを知っている人はいますか?

4

3 に答える 3

2

ServiceContract には CallbackContract が必要ですか? その場合は、ここでコールバックの再入可能性について読むことをお勧めします。これは、コールバックを使用しているときに、デッドロックを防ぐために WCF が通信チャネルをプロアクティブにフォールトする方法と、デッドロックを防ぐために何をすべきかについての適切な説明です。

于 2011-03-02T14:09:00.220 に答える
1

私が参考にして自分で実装した別の解決策は、「ハートビート」を設定することです。構成を MultipleMessagesPerPoll に設定していますが、クライアントが少なくとも 9 秒ごとにサーバーに ping を送信しているため、サービスは問題なく実行され続けています。これはちょっとした魔法の数字のように思えました。9 秒後にチャネルがタイムアウトになり、障害状態になります。(ping などと呼ばれるメソッドを使用して) サービスに ping を実行するスレッドをセットアップするだけで、サービスはクライアントに "pong" で応答できます。

この問題は、Chrome やその他のブラウザーでは問題にならないと思われることに同意してください。

于 2011-12-08T14:09:38.493 に答える
0

最後に、同様の質問で awnser を見つけました: Silverlight PollingDuplex InnerChannel faulted with multipleMessagesPerPoll (serverPollTimeout)

PollingDuplexHttpBinding を PollingDuplexMode.MultipleMessagesPerPoll に設定し、アプリケーションを IE 8 で実行するとバグがあるようです (他のブラウザーは影響を受けません)。

解決策は、PollingDuplexMode を SingleMessagePerPoll に設定することです。これは、パフォーマンスは低下しますが、IE8 では有効です。

于 2011-03-04T13:11:18.140 に答える