質問

私はTomek Janczukのフォローに従いました HTTPポーリングデュプレックスWCFチャネルを使用したPub/サブサンプル しかし、ブラウザを閉じることでクライアントが切断されると、サービスが次のコールバックで気付かないことに気付きました。エンドポイントがもうそこにいないと言うことを期待していたでしょう。

クライアントへの公開を停止するために、クライアントがいつなくなったかをどのように知ることができますか?

役に立ちましたか?

解決

単純な解決策ではありますが、1つの不満足なものがあるようです。クライアントのコールバックがタイムアウトする場合は、再度電話しないでください。

私のシステムでは、マニュアルの「チェック」通話も実装しました - すべて n 数秒は、クライアントがまだそこにあるかどうかを確認するために、登録されたクライアントごとにコールバックチャネル上でパラメーターのないメソッドを呼び出します。私はそれが本当に良い考えだったのではないかと思い始めています - 私はデバッガーでクライアントを一時停止したため、コールバックタイムアウトが発生し続ける新しい問題があります。

他のヒント

確かに知るために: 無理だよ.

TCP接続が閉じられている場合(HTTP呼び出しの根底にある)、特別なTCPメッセージがサーバーに送信されます-Finパケット。 HTTPはステートレスですが、根底にあるTCP接続はステートフルであり、維持することで、根底にあるTCP接続は通常開いたままです。クライアントが廃棄された場合、TCP接続は閉じられ、通常はサーバーに送信されます。しかし、それがクラッシュするか、そのネットワークが切断された場合、これを行う時間はありません。だから一言で言えば、あなたは決して確信することはできません。

ここ 詳細については。

その難しい、ほとんど不可能です (限られたSLデュプレックス機能の原因)。当社のサービスにユーザーのリストを実装しました。プロパティ「isDisconnected」とLast-CommunicationTimeを追加しました。WCFサービスがタイムアウトを取得し、ユーザーの発信-Message-Queueにメッセージを追加しようとするとタイムアウトを取得し、失敗し、例外をスローします。タイムアウトの。 「isdisconnecte = true」をマークし、次回はそのユーザーにメッセージを送信しようとしないでください。

別のスレッドはそれを見続け、last -communicationtimeが時間の値を超えてisdisconnected = trueを超えていることに気付いた場合、同じユーザーがこの期間内に再び接続しようとしない限り、ユーザーをリストから削除します(ユーザーIDで識別します)。

この問題を処理するために手動で行ったことは非常に多くあります。WCFサービスを忙しくしています。

私はこの問題に直面し、切断されたクライアントを次のコードで削除するスレッドを作成しました。正常に動作しますが、10〜15分後に切断されたクライアントをクライアントリストからドロップします(これは私にとっては問題ありませんでした)。

    new Thread(new ThreadStart(() =>
    {
        while (SilverlightClients != null)
        {
                lock (SilverlightClients)
                {
                    SilverlightClients = SilverlightClients.Where(d => (d.Callback as IContextChannel).State != CommunicationState.Opened).ToList();
                }

            Thread.Sleep(1000);
        }
    })) { Name = "Thread Remove Disconnected Clients" }.Start();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top