首页 > 解决方案 > SignalR:尝试连接时,foreverFrame 传输超时

问题描述

我正在使用 SignalR 和 SQLDependency。当服务器发生变化时,将通知客户端。在客户端:

var job = $.connection.processLogHub;

$.connection.hub.logging = true;
$.connection.hub.transportConnectTimeout = 3000;

job.client.displayLastUpdate = function (displayLastUpdate) {
    displayProcessLogChangeNotification(displayLastUpdate);
};

job.client.displayJobsLocked = function (realTimeLockedJobs) {
    displayJobsLockedUnlocked(realTimeLockedJobs);        
};

$.connection.hub.start().done(function () {
}).fail(function (e) {

    alert('error signalr : ' + e);
    console.log(e);

}); 

$.connection.hub.disconnected(function () {
    console.log("$.connection.hub.disconnected");
    setTimeout(function () {
        console.log("restart");
        $.connection.hub.start();
    }, 1000);
});

服务器端:

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
            GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromSeconds(10);
        }
    }

ProcessLogHub 类:

public class ProcessLogHub : Hub
    {
        public static void DisplayLastUpdate(string lastUpdateDate)
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ProcessLogHub>();
            context.Clients.All.displayLastUpdate(lastUpdateDate);
        }

        public static void DisplayJobsLocked(IEnumerable<RealtimeLockedJob> realTimeLockedJobs)
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ProcessLogHub>();
            context.Clients.All.displayJobsLocked(realTimeLockedJobs);
        }
    }

此代码有时运行良好。但有时突然它不再起作用并给我以下日志:

[15:12:27 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'processloghub'.
[15:12:27 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with '/JMT/signalr/negotiate?clientProtocol=2.1&connectionData=%5B%7B%22name%22%3A%22processloghub%22%7D%5D'.
[15:12:27 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with '/JMT/signalr/negotiate?clientProtocol=2.1&connectionData=%5B%7B%22name%22%3A%22processloghub%22%7D%5D'.
[15:12:28 GMT-0400 (Eastern Daylight Time)] SignalR: serverSentEvents transport starting.
[15:12:28 GMT-0400 (Eastern Daylight Time)] SignalR: This browser doesn't support SSE.
[15:12:28 GMT-0400 (Eastern Daylight Time)] SignalR: serverSentEvents transport failed to connect. Attempting to fall back.
[15:12:28 GMT-0400 (Eastern Daylight Time)] SignalR: foreverFrame transport starting.
[15:12:28 GMT-0400 (Eastern Daylight Time)] SignalR: Binding to iframe's load event.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: foreverFrame transport timed out when trying to connect.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: Stopping forever frame.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: foreverFrame transport failed to connect. Attempting to fall back.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: longPolling transport starting.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: Opening long polling request to 'https://pprd-entrypoint.bell.ca/JMT/signalr/connect?transport=longPolling&clientProtocol=2.1&connectionToken=ZtAV8xQcGKXtBY%2F2Ke3J12DeAYy3QQMirAWzzY4%2FeAW2oX1JeNkg6heTD%2BPUL8nnfgi6MoKl%2Fd1YliMMN6euu0YyLf7uBs02LQ7GsDb%2Fe9MDHrcD4SYESNHbfK3cZxzm&connectionData=%5B%7B%22name%22%3A%22processloghub%22%7D%5D'.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: Long poll complete.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: longPolling transport failed to connect. Attempting to fall back.
[15:12:41 GMT-0400 (Eastern Daylight Time)] SignalR: Fallback transports exhausted.
Error: No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.
   {
      [functions]: ,
      __proto__: {
         [functions]: ,
         __proto__: {
            [functions]: ,
            __proto__: null
         },
         message: "",
         name: "Error"
      },
      description: "No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.",
      message: "No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.",
      name: "Error",
      source: undefined
   }
[15:13:36 GMT-0400 (Eastern Daylight Time)] SignalR: Stopping connection.
[15:13:36 GMT-0400 (Eastern Daylight Time)] SignalR: Fired ajax abort async = true.
[15:13:36 GMT-0400 (Eastern Daylight Time)] SignalR: LongPolling failed to connect.
[15:13:36 GMT-0400 (Eastern Daylight Time)] SignalR: Failed to parse server response while attempting to connect.
Unable to get property 'hub' of undefined or null reference

在成功的情况下,foreverFrame 可以连接到服务器:

[16:27:38 GMT-0400 (Eastern Daylight Time)] SignalR: foreverFrame transport connected. Initiating start request.
[16:27:38 GMT-0400 (Eastern Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state.
[16:27:38 GMT-0400 (Eastern Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000

你能告诉我为什么 SignalR foreverFrame 可以打开和关闭,我该如何解决?是因为我使用 2 事件进行通知吗?谢谢

标签: signalr

解决方案


推荐阅读