Dot-Net

Signalr 中的每個請求靜態數據

  • September 19, 2016

我想在 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();
}

希望這可以幫助。知道你是如何處理這個問題的也會很有趣。

引用自:https://stackoverflow.com/questions/33745866