我在单声道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天这个问题。
答案 0 :(得分:2)
我深入研究了这个问题并提出了这个根本原因:
当客户端连接时,它会尝试首先使用“服务器已发送事件”进行连接。此连接似乎有效,并由服务器接收,触发OnConnected并正确地将组ID返回给客户端。 但是出于某种原因,当在apache2和mono上运行时,从未收到此响应,并且EventSource对象的“open”事件也不会触发。这意味着在3秒后,SignalR在客户端上超时此连接请求并假定SSE无法正常工作并启动longPolling会话。
此会话连接成功,可以发送和接收数据但连接ID已经发送到服务器而OnConnected没有再次触发,因此我的集线器无法获得第二次连接尝试,客户端将无法获取小组id。
直接使用longPolling通过$ .connection.hub.start({transport:“longPolling”})启动客户端,但仅以使用longPolling为代价来解决问题。