无法通过SignalR Hub访问会话信息.我的设计错了吗?

Let*_*man 19 c# asp.net-mvc-4 signalr

我刚刚发现你无法访问SignalR Hub中的当前会话.

简化我的场景:我试过写聊天.

当前用户的名称保留在会话中.

我已经使用SignalR来更新(一组连接)每个新消息.

现在我看到我无法通过集线器访问当前用户的名称.

我想可能会有一些变通方法,但是我的设计是错误的吗?

我不应该为此目的使用SignalR吗?或者我不应该Session以这种方式使用?

Lar*_*ner 25

您不应该使用Session与SignalR(请参阅SignalR不在服务器上使用Session).您可以通过其连接ID识别逻辑连接,您可以映射到用户名.

基本问题是在ASP.NET中序列化对SessionState的访问以确保状态一致性,因此对集线器的每个请求都将阻止其他请求.在过去,有限的只读访问(我假设(但由于要点已经消失)无法确认,通过将EnableSessionstate设置为只读,这可以防止我所描述的锁定问题),但是对此的支持被删除了.另请参阅SignalR团队发表类似声明的其他各个地方.最后:有官方在一份声明文件有关HTTPContext.Current.Session.

  • @Letterman我在答案中添加了更多细节,以及一些链接 (2认同)

小智 11

您可以通过Query String将值从客户端发送到服务器中心.

在该$.connection.hub.start()方法之前,您可以添加如下内容:

客户端JS代码:

// Replace "some value" with the session value or anything you want
$.connection.hub.qs = { "Name": "some value" };

$.connection.hub.start()...bla bla bla
Run Code Online (Sandbox Code Playgroud)

在Hub的服务器端,您可以在任何方法中使用它:

string ClientValue= Context.QueryString["Name"].ToString();
Run Code Online (Sandbox Code Playgroud)

我没有用会话测试,但当然在客户端你可以尽可能地棒.