4

IConnectionIdGeneratorWebフォームアプリケーションで簡単にするために、ログインした認証済みユーザーのEmailAddress.ToLower()によってクライアント接続IDに名前を付ける独自の実装を作成しました(それが利用できない場合は、デフォルトでGUIDに戻ります)。すべての背後にある私のページコードからクライアントを呼び出すことは正常に機能します。

hubContext.Clients[LoggedInUser.EmailAddress.ToLower()].updateProgress(i)

ただし、同じログインユーザーで別のブラウザまたはタブを開くと、両方のウィンドウのforeverframe接続で301の結果が表示され続け、200の結果が交互に繰り返されるようです。

同じ接続IDを割り当てると、接続先に関係なく、メッセージがシステムの正しいユーザーに正しく送信されるようにする簡単な方法が得られると思いました。

それらは常に一意である必要があり、ログインしたユーザーアカウントへの接続を管理するために別のレイヤーを構築する必要がありますか、それともここでトリックを見逃していますか?

4

3 に答える 3

4

接続IDは一意である必要があります。それらを一意にしないと、一方が他方の接続をオフラインでキックします。内部的には、接続IDを接続の一意の識別子として使用し、重複を切断します。

301の応答が繰り返される場合は、アプリにsignalrというフォルダーがあり、接続IDの共有に直接関係していない可能性があります。

于 2012-07-23T00:58:08.177 に答える
2

私は最近同じことを試みて同じ問題を経験したので、私の結論は、接続 ID は一意でなければならないということです。

この問題を回避するために私がしたことは、デフォルトの GUID 接続 ID を使用し、代わりに、接続を開始した後に自分の ID (この場合は電子メール アドレス) で識別されるグループに接続を追加することでした。この方法で呼び出すことができClients[emailAddress].doSomething()、このユーザーの開いているすべてのタブにブロードキャストします。

于 2012-07-18T11:19:26.907 に答える
0

はい、完璧です。私は同様の結論に達しました。

また、クライアントが現在の URL に固有の同じ電子メール アドレス グループにメッセージをブロードキャストする方法を考えようとしています (そのため、あるページの進行状況バーは別のページの進行状況バーも更新しません)。

グループIDを次のように拡張してemailAddress + currentURL、2つの文字列の単なる組み合わせにします。ただし、グループ コレクションを取得し、電子メール アドレスを解析して、各電子メール アドレスと URL の組み合わせにメッセージを送信する方法がない限り、グローバル サイト ブロードキャスト (すべての URL への) の実行が困難になります。

クライアント側のチェックにタグを付けて、更新するページの進行状況バーに固有のパラメーターとして進行状況バー ID を送信するだけの方がよい場合があります。

于 2012-07-18T23:36:43.193 に答える