我想在SignalR请求的生命周期内静态存储用户信息。我在WebAPI中使用HttpContext.Current.Items这样做但在SignalR中不存在。
我知道ThreadStatic不能正常工作,因为SignalR线程可以在多个请求之间共享。
作为参考,我在IIS中托管它并使用最新版本的SignalR(2.2.0)
答案 0 :(得分:0)
回答这个问题肯定是很晚的,也许你已经为此找到了一些东西。这只是试图分享我对这个问题的看法。
首先,您可以为SignalR启用身份验证,然后您可以在集线器方法中使用Context.User.xxx
。
要启用authentication for all hubs,您可以执行以下操作:
public partial class Startup {
public void Configuration(IAppBuilder app) {
app.MapSignalR();
GlobalHost.HubPipeline.RequireAuthentication();
}
}
一旦这样做,您仍然可以使用通常的身份验证管道来验证您的请求,这些信息将通过Hub
属性提供给Context.User
方法。以下是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();
}
希望这会有所帮助。知道你如何处理这个问题也很有趣。