ASP.NET SignalR Troubeshooting
method could not be resolved
场景:
Javascript客户端不生成代理,调用服务端方法。
按照官网文档的用法:
contosoChatHubProxy.invoke('newContosoChatMessage', { UserName: userName, Message: message}).done(function () {
console.log ('Invocation of NewContosoChatMessage succeeded');
}).fail(function (error) {
console.log('Invocation of NewContosoChatMessage failed. Error: ' + error);
});
但是实际调用时,却抛出以下异常:
'SendMessage' method could not be resolved.
Potential candidates are: SendMessage(toFinanceId:String, toCustomerName:String, message:String):Task
原因:调用服务端方法时,传递的参数类型不对。
这里服务端方法定义的是三个参数,而我传递的是包含这三个参数的对象,因此不匹配。
参考:.NET Client unable to call hub methods with array parameters
当SignalR连接超过2个时,网站请求被全部阻塞
前一段时间在网站中利用 SignalR 增加了实时聊天功能,最初的开发过程一切正常,但是自从更换新电脑后,出现一个现象:
打开网站,第一批请求都完毕后,后续所有的请求都变成 pending 状态,服务器一直没有进行响应。
查看 IIS 工作进程的当前请求,可以看到有3个 SignalR 的连接,并没有其他正在被处理的请求。
我尝试在代码中把 SignalR 部分注释掉,然后之前所有被阻塞的请求突然活了过来。
于是猜测可能是使用 SignalR 不当造成的,但是相同的代码在之前的电脑上则没有该问题。
这两台电脑的一个不同之处是,旧电脑的 OS 是 Windows 10 Professional,新电脑的 OS 是 Windows 10 Home。
于是在关键词中新增关键词 Windows 10 Home
,再次Google,很快找到了答案:
不同的 Windows 版本, IIS 有并发连接数限制并且各个版本不同。
Windows 10 Home : 3
Windows 10 Professional : 10
需要说明的是,该限制取决于Windows版本而不是IIS版本。
Windows 版本可以划分为 Client 版本和 Server 版本,Client 版本有限制,如 Windows 7、Windows 8、Windows Vista;但是 Server 版本没有限制,如 Server 2003、Server 2008、Server 2012。
经过验证, 装有 Windows 10 Professional 电脑的 IIS 并发请求数量不能超过9个。
总结排错过程:
- 排查代码;
- 两台电脑的操作系统的区别;