【问题标题】:Per-Request static data in SignalrSignalr 中的每个请求静态数据
【发布时间】:2016-09-19 23:43:10
【问题描述】:

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

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

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

【问题讨论】:

  • 大多数解决方案都涉及另一个更持久的类或紧要关头的字典。您是否尝试过Dictionary<string, SomeCoolObject>,将 ConnectionID 映射到您想要跟踪的任何数据?在OnConnect 中添加人员,在OnDisconnect 中删除他们。

标签: .net signalr signalr-hub


【解决方案1】:

回答这个问题肯定已经很晚了,也许你已经想出了一些办法。这只是试图分享我对这个问题的想法。

首先,您可以为 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();
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多