我无法弄清楚我在这里做错了什么。我的应用程序中有几个地方SignalR工作正常,但出于某种原因,在这个集线器上,我的客户端方法永远不会被调用。
JS:
var fundingAdequacyHub;
$(function () {
fundingAdequacyHub = $.connection.fundingAdequacyHub;
fundingAdequacyHub.client.broadcastStateChange = function (id, result) {
console.log('state changed');
};
var connection = fundingAdequacyHub.connection;
connection.start().done(hubReady);
});
function hubReady(){
fundingAdequacyHub.server.stateChange(1, "new state");
}
在我的C#中,当我调用服务器方法时会触发此方法,但永远不会在客户端上触发broadcastStateChange
public void StateChange(int id, string vm)
{
//breakpoint here, no errors generated or anything when it goes past this line
Clients.All.broadcastStateChange(id, vm);
}
为什么broadcastStateChange
没有被调用?我究竟做错了什么?我在SO上发现的类似问题是说我在启动集线器之前没有绑定该方法,但我正在这样做。
我也尝试开启connection
的日志记录。我看到调用了server方法,但没有输出说客户端方法被调用。
我也遇到了很慢的连接,这可能是真正问题的另一个症状。我试图剥离我的集线器以不进行任何数据库调用或任何事情,但是仍然得到非常慢的集线器启动时间和调用server.stateChange()
和服务器上的调试断点之间的延迟可能是几秒钟。关于什么可能导致性能缓慢的任何想法?我在网站上有其他工作正常,这个比这些更简单。
更多信息:我发现这些相同的代码在服务器上部署时工作正常,只有在本地计算机上运行时才能正常工作。
我能够通过缓慢地逐步执行代码来获取客户端方法一次,但是无法重现它。
2015年5月13日更新
我在开发人员工具中进行了一些挖掘,特别是网络选项卡。在localhost上,会发生某种轮询,一个连接打开约20秒然后关闭并打开一个新连接。时间表一遍又一遍地延伸。但是,当在服务器上运行时,我看到它设置了一个Web套接字,时间线保持不变,一切正常。因此,似乎在localhost上,SignalR没有使用Web套接字并且无法正常工作。
Localhost SignalR log
SignalR: Client subscribed to hub 'fundingadequacyhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22fundingadequacyhub%22%7D%5D'.
SignalR: serverSentEvents transport starting.
SignalR: Attempting to connect to SSE endpoint 'http://localhost:200/signalr/connect?transport=serverSentEvents&clientProto…%3D&connectionData=%5B%7B%22name%22%3A%22fundingadequacyhub%22%7D%5D&tid=9'.
SignalR: EventSource connected.
SignalR: serverSentEvents transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
服务器信号日志
SignalR: Client subscribed to hub 'fundingadequacyhub'.
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22fundingadequacyhub%22%7D%5D'.
SignalR: webSockets transport starting.
SignalR: Connecting to websocket endpoint 'ws://intranet:200/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=0TdJtNtl6Vm0PszuLIIliTk1jez5v%2BmRH0edUKti3NX7Cmop5frD9u%2BCUjD4f3PeFGjneFwT85MTLqwXFIQakB3VzwD8ISoYHn3LaABVvQhfC1Fzy9fkPYlOyLAkInD8YZoCeCVMEKKmb7S%2FLacIDQ%3D%3D&connectionData=%5B%7B%22name%22%3A%22fundingadequacyhub%22%7D%5D&tid=0'.
SignalR: Websocket opened.
SignalR: webSockets transport connected. Initiating start request.
SignalR: The start request succeeded. Transitioning to the connected state.
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000
另一次更新......
所以看起来我的开发机器Windows 7的websockets aren't supported。但是,我有其他使用SignalR的页面正如我所期望的那样工作,因此serverSentEvents
模式出现了错误。
希望最终更新
现在,莫名其妙地,它运作良好。我不知道发生了什么变化,但它现在正在工作。我所做的不是使用start()
启动我的集线器,而是使用start({ transports: ['webSockets']})
启动它,但由于Windows 7不支持套接字,因此无法连接。当我再次删除该子句时切换回start()
,它开始工作。