2015-11-16 11 views
8

SignalRリクエストの有効期間中、ユーザ情報を静的に保存したい。私はHttpContext.Current.Itemsを使用してWebAPIでこれを行いましたが、それはSignalRには存在しません。SignalRのリクエストごとの静的データ

私は、SignalStスレッドが複数のリクエスト間で共有できるため、ThreadStaticは動作しないことを知っています。私はIISの中でそれをホストし、SignalRの最新バージョンを使用しています参考

(2.2.0)

+0

ほとんどのソリューションには、別のより永続的なクラスまたはピンチの辞書が含まれます。 'Dictionary 'を試したことがありますか?あなたが追跡したいデータにConnectionIDをマッピングしましたか? 'OnConnect'に人を追加し、' OnDisconnect'で人を削除します。 –

答えて

0

これは非常に遅く、この質問に答えるために、確かにあると多分あなたは、このために何かをすでに考え出しました。これは私の考えをこの問題に分かち合うための試みです。

まず、SignalRの認証を有効にしてから、ハブの方法でContext.User.xxxを使用できます。

authentication for all hubsを有効にするために、あなたはこのような何かを行うことができます。

public partial class Startup { 
    public void Configuration(IAppBuilder app) { 
     app.MapSignalR(); 
     GlobalHost.HubPipeline.RequireAuthentication(); 
    } 
} 

あなたはまだあなたの要求を認証するために、あなたの通常の認証パイプラインを使用することができ、それらの情報はContext.Userプロパティを通じてHub方法に供給されることをやるたら。以下はhereの一例です。これに伴い

public async Task JoinRoom(string roomName) 
{ 
    await Groups.Add(Context.ConnectionId, roomName); 
    Clients.Group(roomName).addChatMessage(Context.User.Identity.Name + " joined."); 
} 

(それはスケールアウトできるように)あなたは、このようなRedisのキャッシュまたは類似したものとして、アウト・オブ・メモリ記憶装置にユーザごとのデータを維持することができます。

また、別の方法として、HubPipelineModuleを拡張し、custom oneを作成して、イベントをより細かく制御することもできます。

public class LoggingPipelineModule : HubPipelineModule 
{ 
    protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context) 
    { 
     return base.OnBeforeIncoming(context); 
    } 
    protected override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context) 
    { 
     return base.OnBeforeOutgoing(context); 
    } 
} 

public void Configuration(IAppBuilder app) 
{ 
    GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule()); 
    app.MapSignalR(); 
} 

これが役に立ちます。また、あなたがどのように問題に対処しているか知ることは興味深いでしょう。

関連する問題