見つけたので紹介。
Why do I code with this guy?: Using the PollingDuplexHttpBinding for a Silverlight Group Chat
リンク先でソースをダウンロード出来るので見てみました。
以下、ソースを読んで個人的に分かりにくかったポイントのメモ。
・サーバー側(WCF サービス)では、セッション毎にサービスのインスタンスが生成されるようにして、クライアントの接続が切れたら自動的に破棄される設定?になっている。
・サービス側で接続されたクライアントリストの保持(static 変数)と、インスタンス変数でこのインスタンスに対応するクライアントを保持。(初期処理呼び出し時 InitiateDuplex メソッド)
・サービス側の各インスタンスは、定期的(System.Threading.Timer)に対応するクライアントに対してコールバックを呼び出す。(生存確認メッセージを送信、タイムアウトを防ぐ)
※コールバックを呼び出すと書いているが、当然サーバーからクライアントのメソッドを直接呼び出している訳では無い!
・クライアントからメッセージが送信されたら、全てのクライアント(static で保持している)のコールバックを呼び出す。(メッセージの配信)
・配信に失敗したクライアントは、接続が切れた物として static なリストから削除する。
・クライアント側では、サーバーからのコールバックが呼ばれた際にメッセージの内容が生存確認かチャットのメッセージかを判断して処理する。
WCF の設定項目(属性等)をイマイチ理解していないので辛いな〜、何があるのかも調べてないし…。