单声道组上的 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 天。

单声道组上的 SignalR.Add 在 OnConnected 中不起作用

我深入研究了

这个问题,并提出了这个根本原因:

当客户端连接时,它会尝试首先使用服务器发送事件进行连接。此连接似乎有效,并被服务器接收,触发 OnConnected 并将组 ID 正确返回给客户端。但是,由于某种原因,当在 apache2 和 mono 上运行时,永远不会收到此响应,并且 EventSource 对象的"打开"事件也不会触发。这意味着 3 秒后,SignalR 在客户端上使此连接请求超时,并假定 SSE 不工作并启动 longPolling 会话。

此会话连接成功,可以发送和接收数据,但连接 ID 已发送到服务器,并且不会再次触发 OnConnected,因此我的集线器无法获得第二次连接尝试,客户端也不会获取组 ID。

通过 $.connection.hub.start({ transport: "longPolling" }) 直接使用 longPolling 启动客户端可以解决此问题,但代价是仅使用 longPolling。