Dot-Net
Signalr 中的每個請求靜態數據
我想在 SignalR 請求的整個生命週期內靜態儲存使用者資訊。我已經在使用 HttpContext.Current.Items 的 WebAPI 中這樣做了,但這在 SignalR 中不存在。
我知道 ThreadStatic 不起作用,因為 SignalR 執行緒可以在多個請求之間共享。
作為參考,我將它託管在 IIS 中並使用最新版本的 SignalR (2.2.0)
回答這個問題肯定已經很晚了,也許你已經為此找到了一些東西。這只是試圖分享我對這個問題的想法。
因此,首先,您可以為 SignalR 啟用身份驗證,然後可以
Context.User.xxx在您的集線器方法中使用。要為所有集線器啟用身份驗證,您可以執行以下操作:
public partial class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); GlobalHost.HubPipeline.RequireAuthentication(); } }一旦你這樣做了,你仍然可以使用你通常的身份驗證管道來驗證你的請求,並且這些資訊將通過屬性提供給
Hub方法。Context.User下面是這裡的一個例子。public async Task JoinRoom(string roomName) { await Groups.Add(Context.ConnectionId, roomName); Clients.Group(roomName).addChatMessage(Context.User.Identity.Name + " joined."); }除此之外,您可以在記憶體不足的儲存中維護每個使用者的數據(以便它可以橫向擴展),例如 Redis 記憶體或類似的東西。
或者作為一種替代方法,您還可以擴展HubPipelineModule,並創建一個自定義的,以便對事件進行更精細的控制。
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(); }希望這可以幫助。知道你是如何處理這個問題的也會很有趣。