2

我正在使用带有集线器的 SignalR 0.5.3,并且我明确地将传输设置为长轮询,如下所示:

$.connection.hub.start({ transport: 'longPolling' }, function () {
    console.log('connected');
});

使用这样的配置(在 global.asax.cs Application_Start 方法中):

GlobalHost.DependencyResolver.UseRedis(server, port, password, pubsubDB, "FooBar");
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(2);
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(15);

然而,长轮询似乎既不适用于开发(IIS express)也不适用于生产(IIS 7.5)环境。连接似乎正确,但是长轮询请求总是超时(大约 2 分钟后),然后重新连接。来自 IIS 的日志在这里。第一次超时请求的响应:

{"MessageId":"3636","Messages":[],"Disconnect":false,"TimedOut":true,"TransportData":{"Groups":["NotificationHub.56DDB6692001Ex"],"LongPollDelay":0}}

超时重新连接响应如下所示:

{"MessageId":"3641","Messages":[],"Disconnect":false,"TimedOut":true,"TransportData":{"Groups":["NotificationHub.56DDB6692001Ex"],"LongPollDelay":0}}

我将不胜感激有关此问题的任何帮助。谢谢。

编辑

如果重新连接意味着新的长轮询周期的开始,为什么当 global.asax.cs 中的 KeepAlive 设置设置为 15 秒时,它会在大约 2 分钟后启动?问题是我在 IIS 前面有一个反向代理,它在 25 秒后超时保持活动请求,因此当达到此反向代理超时时我得到 504 响应。

4

2 回答 2

5

看看这篇文章:Signalr 如何在内部工作。长拉的工作方式是在设定的时间后连接将超时或收到响应并拉回(重新连接)

于 2012-10-20T21:53:48.010 回答
0

长时间轮询禁用保持活动功能。似乎使用 ConnectionTimeout 代替。

此设置表示在关闭传输连接并打开新连接之前保持传输连接打开并等待响应的时间量。默认值为 110 秒。

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/handling-connection-lifetime-events#timeoutkeepalive

如果请求超时并且服务器没有发送任何数据,但您希望它发送,则可能是服务器端的一些问题,您还没有看到。

于 2021-06-25T09:21:36.000 回答