单声道Group上的SignalR。添加不在OnConnected中工作

时间:2013-10-16 11:53:17

标签: c# asp.net-mvc-3 mono signalr signalr-hub

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

我创建了以下Hub:

    public class TestHub : Hub
    {
      public override Task OnConnected()
      {
        Trace.WriteLine(String.Format("Join Group: {0}", Context.User.Identity.Name), "SignalR.General");
        Task addTask = Groups.Add(Context.ConnectionId, Context.User.Identity.Name);
        return addTask;
      }

      public void JoinGroup(String group)
      {
        Trace.WriteLine(String.Format("Join Group2: {0}", Context.User.Identity.Name), "SignalR.General");
        Groups.Add(Context.ConnectionId, group);
      }

      public void Echo(String group, String value)
      {
        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中托管,但是当我在单声道托管时没有响应

如果另一方面我首先从客户端调用JoinGroup,它可以在IIS和Apache上使用mono。 发送消息给Clients.All也可以在IIS和单声道中工作,但我需要消息才能到达特定用户。

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

任何想法都会受到高度赞赏,因为我已经浪费了2天这个问题。

1 个答案:

答案 0 :(得分:2)

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

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

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

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