我正在开发一个asp.net mvc项目,我们使用SignalR在不同视图中实时连接。除了如果SignalR出现问题,javascript的执行停止这一事实外,效果很好。通常,如果我的自托管应用程序出现故障或发生其他连接问题,则此错误将成为问题。
GET http://localhost:8081/signalr/hubs net::ERR_CONNECTION_REFUSED List:328
Uncaught TypeError: Cannot read property 'client' of null
如上所述,如果发生这种情况,它会阻止我的所有其他javascript执行,从而无法正确呈现我的视图或布局。有没有办法解决这个问题,所以视图继续加载并运行其javascript?
我的典型观点如下:
@model Services.Models.SomeModel
<script src="~/Scripts/jquery.signalR-2.0.2.js"></script>
<script src="http://localhost:8081/signalr/hubs"></script>
<script src="~/Scripts/signalR.connector.js"></script>
<script src="~/Scripts/signalR.fleet.js"></script>
<div id="page-content">
...
</div>
连接器如下所示:
$.connection.hub.url = "http://localhost:8081/signalr";
//Enable logging
$.connection.hub.logging = true;
// Proxy created on the fly
var messageHub = $.connection.myHub;
if (messageHub == null)
return null;
messageHub.client.timeEnabled = true;
... ommitted functions ...
$.connection.hub.start(function () {
var id = $('#signalRId').text();
messageHub.server.joinGroup("operationStatus-" + id);
console.log("Joined group: operationStatus-" + $('#signalRId').text());
}).done(function () {
console.log('Now connected, connection ID=' + $.connection.hub.id);
}
).fail(function () { console.log('Could not Connect'); });
答案 0 :(得分:1)
我也有这个问题。一种简单的方法是在完成的回调中设置一个布尔值。
connected = true;
然后在每次请求之前检查。
我给我写了一个免费提供我所有SignalR内容的lib,并给我成功和错误回调。在这种情况下,我会得到一个内容为“未连接”或其他内容的errorCallback。使用lib,你只需要编写一次。
答案 1 :(得分:1)
不完全确定你要求的是什么,但这是我的想法 - 你的基本工具是......
检查有问题的情况
if (messageHub) {
// set up client hub methods and start connection ...
} else {
// /signalr/hubs script didn't load properly, so skip setting up signalr
}
使用try / catch(对于可能导致问题但不太可预测的事情);阅读jquery.signalR-*
以查看SignalR代码可能引发的错误
使用window.onerror(also see this SO post)的全局错误处理程序:
window.onerror = function(message, url, lineNumber) {
console.log(message);
};