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个。

总结排错过程:

  1. 排查代码;
  2. 两台电脑的操作系统的区别;

参考: Windows 8 / IIS 8 Concurrent Requests Limit

posted @ 2018-07-13 16:16  song-z  阅读(431)  评论(0编辑  收藏  举报