web-dev-qa-db-ja.com

SignalRおよびHttpContext / Session

SignalRがあなたに HttpContextへのアクセス を与えない理由を理解しています。しかし、これは私たちにとって非常に問題があります。説明させてください:

私たちのアプリケーションは、ユーザーがログイン中に環境を選択するマルチテナントアプリケーションです。これは基本的にConnectionStringNameをHttpSessionに登録します。 SignalRハブでは、Disconnectのデータベースにアクセスする必要があります。ただし、この時点ではHttpContextがなく、書き込む環境を決定できないため、これは不可能です。

誰かがこの問題を解決する方法の提案を私たちに提供できますか?私たちはこれに少し立ち往生しています。

[〜#〜] edit [〜#〜]:ソリューションが負荷分散環境で機能する場合のボーナスポイント。

20
Lodewijk

これは古い質問ですが、他の人に役立つ場合に備えて、答えを残しておきます。

ハブは拡張されているためMicrosoft.AspNet.SignalR.HubタイプのContextプロパティにアクセスできますHubCallerContext

このプロパティは、呼び出し元からの多くの情報を公開します。

  • ConnectionId
  • ヘッダー
  • クエリ文字列
  • リクエスト
  • クッキー
  • ユーザー

私のソリューションでは、Context.User.Identity.Nameに格納されているユーザー名をキー/値ストア(私の場合はRedis)のキーとして使用してすべてを追跡しますユーザーが持っている接続。

OnConnnectおよびOnDisconnectをオーバーライドして、ユーザーに関連付けられている接続のリストを維持できます。また、接続ID(この場合はユーザー接続文字列)とともに、必要なものをすべて保存することもできます。

23
Raciel R.

こんにちは、SignalRハブへのリクエストをパーソナライズするために、アプリケーションへの認証されていない訪問者を特定する必要があるのと同様の問題がありました。

「HttpContext.Current.Request.AnonymousId」にアクセスして解決しました。 AnonymousIdは、SQLデータベースの自己実装セッションエンティティの一時レコードにマップされます。基本的には、データベースに基づくセッションをエミュレートします。

AnonymousIdをカスタマイズしたり、データベースエントリを初期化したりする場合の関連ドキュメントは次のとおりです。 http://msdn.Microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx

さらに、次のようにOnDisconnected()のコンテキストにアクセスできるはずです:Context.Request.GetHttpContext()

これがお役に立てば幸いです。

9
JDR

辞書のようなものを使用して、ユーザーが接続するときにユーザーのConnectionIdを追跡できます。また、SQL Serverを使用してセッション状態を保存することも役立つ場合があります: http://support.Microsoft.com/kb/317604

SignalRは、disoconnect()が起動されたときに追跡するために使用できるUser.Identity.Nameへのアクセスを提供します。

0
Steve

ソリューションが負荷分散された環境で動作する必要があるという事実は、接続文字列をセッションとは異なるものに格納する必要があるという事実を強制します。キーがConnectionId(切断時に利用可能な唯一の情報)であり、値が接続文字列であるキー値ストア(どのように実装するかは重要ではありません)。必要に応じて他の場所でSessionを使い続けることができますが、少なくともその情報については、アプリケーション全体をそこから読み書きできるように移動する必要があると思います。

0
Wasp