单声道组上的 SignalR.Add 在 OnConnected 中不起作用
本文关键字:Add SignalR OnConnected 不起作用 声道 单声道 | 更新日期: 2023-09-27 18:35:40
我在单声道MVC3中运行SignalR时遇到问题。
我创建了以下中心:
公共类测试中心:集线器 { 公共覆盖任务连接() { Trace.WriteLine(String.Format("Join Group: {0}", Context.User.Identity.Name), "SignalR.General"); Task addTask = Groups.Add(Context.ConnectionId, Context.User.Identity.Name); 返回添加任务; } 公共无效 加入组(字符串组) { Trace.WriteLine(String.Format("Join Group2: {0}", Context.User.Identity.Name), "SignalR.General"); Groups.Add(Context.ConnectionId, group); } 公共无效回显(字符串组,字符串值) { Trace.WriteLine(String.Format("Echo: {0}, {1}", group, value), "SignalR.General"); Clients.Group(group).echo(value); } }
主要问题如下:
用户通过表单身份验证登录,并在 Context.User.Identity.Name 中正确找到其姓名。当客户端连接时,将调用 OnConnected,并将连接添加到与用户名同名的单个用户组。当我从客户端调用 Echo 函数时,组名是用户名,如果我在 IIS 中托管,我会得到正确的响应(响应发送到客户端),但在单声道托管时没有得到响应。
另一方面,如果我首先从客户端调用 JoinGroup,它可以在 IIS 和 Apache 的单声道上运行。向客户端发送消息。所有消息在 IIS 和单声道中都可以使用,但我只需要消息仅针对特定用户到达。
我尝试了此代码的不同变体,但不知道为什么组注册不应该在OnConnected中工作。
任何想法将不胜感激,因为我已经在这个问题上浪费了 2 天。
这个问题,并提出了这个根本原因:
当客户端连接时,它会尝试首先使用服务器发送事件进行连接。此连接似乎有效,并被服务器接收,触发 OnConnected 并将组 ID 正确返回给客户端。但是,由于某种原因,当在 apache2 和 mono 上运行时,永远不会收到此响应,并且 EventSource 对象的"打开"事件也不会触发。这意味着 3 秒后,SignalR 在客户端上使此连接请求超时,并假定 SSE 不工作并启动 longPolling 会话。
此会话连接成功,可以发送和接收数据,但连接 ID 已发送到服务器,并且不会再次触发 OnConnected,因此我的集线器无法获得第二次连接尝试,客户端也不会获取组 ID。
通过 $.connection.hub.start({ transport: "longPolling" }) 直接使用 longPolling 启动客户端可以解决此问题,但代价是仅使用 longPolling。