在Signalr中按请求提供静态数据

时间:2015-11-16 22:30:42

标签: .net signalr signalr-hub

我想在SignalR请求的生命周期内静态存储用户信息。我在WebAPI中使用HttpContext.Current.Items这样做但在SignalR中不存在。

我知道ThreadStatic不能正常工作,因为SignalR线程可以在多个请求之间共享。

作为参考,我在IIS中托管它并使用最新版本的SignalR(2.2.0)

1 个答案:

答案 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();
}

希望这会有所帮助。知道你如何处理这个问题也很有趣。