1

我在单声道的 MVC3 中运行 SignalR 时遇到问题。

我创建了以下集线器:

    公共类 TestHub : 集线器
    {
      公共覆盖任务 OnConnected()
      {
        Trace.WriteLine(String.Format("加入组:{0}", Context.User.Identity.Name), "SignalR.General");
        任务 addTask = Groups.Add(Context.ConnectionId, Context.User.Identity.Name);
        返回添加任务;
      }

      公共无效加入组(字符串组)
      {
        Trace.WriteLine(String.Format("加入 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);
      }
    }

主要问题如下:

用户通过 Forms auth 登录,并且他们的姓名在 Context.User.Identity.Name 中正确找到。当客户端连接时,将调用 OnConnected 并将连接添加到与用户名同名的单个用户组中。当我以组名作为用户名从客户端调用 Echo 函数时,如果我在 IIS 中托管但在 mono 中托管时没有响应,我会得到正确的响应(响应发送到客户端) 。

另一方面,如果我首先从客户端调用 JoinGroup,它可以在 IIS 和 Apache 上运行。向 Clients.All 发送消息也适用于 IIS 和单声道,但我需要消息仅针对特定用户到达。

我尝试了此代码的不同变体,但不知道为什么组注册不应该在 OnConnected 中工作。

任何想法都将不胜感激,因为我已经在这个问题上浪费了 2 天时间。

4

1 回答 1

3

我更深入地研究了这个问题并提出了这个根本原因:

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

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

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

于 2013-10-17T11:43:49.033 回答