以下で示唆されているテクニックを使用します。
API に ServerPush セットアップを実装して、イベント サーバーからリアルタイム通知を取得します (ポーリングなし)。基本的に、サーバーには RegisterMe() および UnregisterMe() メソッドがあり、クライアントには、WCF の CallbackContract メカニズムを介して呼び出すことができる Announcement(string message) というコールバック メソッドがあります。これはうまくいくようです。
残念ながら、このセットアップでは、サーバーがクラッシュしたり、それ以外の理由で利用できなくなったりしても、クライアントはメッセージをリッスンしているだけなのでわかりません。回線の無音は、アナウンスがないことを意味する場合もあれば、サーバーが利用できないことを意味する場合もあります。
私の目標は即時性ではなくポーリングを減らすことであるため、サーバーへの接続をテストするためだけに存在する RegisterMe() および UnregisterMe() と一緒にサーバーに void Ping() メソッドを追加してもかまいません。このメソッドを定期的にテストすることで、まだ接続されていることを確認できます (また、これは TCP であるため、トランスポートによってアナウンスが破棄されていないことも確認されます)。
しかし、Ping() メソッドが必要ですか、それともこの接続テストは、serverProxy.IsStillConnected() などのように、デフォルトで WCF の一部として利用可能ですか? 私が理解しているように、チャネルの状態は、失敗した Ping() の後にのみ Faulted または Closed を返しますが、代わりには返しません。
2) より広い観点から、このコールバック アプローチは堅実ですか? これは http や ajax 用ではありません。接続されているクライアントの数は少なくなります (最大で数十のクライアント)。このアプローチに深刻な問題はありますか? これは軽度のリスクと思われるため、コールバック キューを十分に高速に処理しないことで、低速/悪意のあるクライアントがサーバーをブロックするのを制限するにはどうすればよいですか? 他の操作に影響を与えずに設定できる、コールバック固有のタイムアウトのようなものはありますか?