加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – SignalR长轮询在5秒内断开连接

发布时间:2020-12-16 00:14:11 所属栏目:asp.Net 来源:网络整理
导读:我的应用程序在公司网络下工作(丑陋的代理和东西).它不能很好地工作.我希望使用https会有所帮助,但事实并非如此.这是我在日志中看到的奇怪模式: [14:13:32 GMT+0600 (N. Central Asia Standard Time)] SignalR: Client subscribed to hub 'modemshub'.[14:1
我的应用程序在公司网络下工作(丑陋的代理和东西).它不能很好地工作.我希望使用https会有所帮助,但事实并非如此.这是我在日志中看到的奇怪模式:
[14:13:32 GMT+0600 (N. Central Asia Standard Time)] SignalR: Client subscribed to hub 'modemshub'.
[14:13:32 GMT+0600 (N. Central Asia Standard Time)] SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5&connectionToken=6aktO0sramoQKhQ9DC7Cs7EbXMUou8LooQRxfup4R0oZCHpBmWBFjyLup%2F3wJLloR8GtJEiUk10YOZJBaSqN8aiGAfXRR4G9hujTFTyiJiz%2FyJ4oMlBIdxqeCc5anI6k&connectionData=%5B%7B%22name%22%3A%22modemshub%22%7D%5D'.
[14:13:32 GMT+0600 (N. Central Asia Standard Time)] SignalR: longPolling transport starting.
[14:13:32 GMT+0600 (N. Central Asia Standard Time)] SignalR: Opening long polling request to 'https://example.com/signalr/connect?transport=longPolling&clientProt…rlCzGHl5kVLClT5ex8&connectionData=%5B%7B%22name%22%3A%22modemshub%22%7D%5D'.
[14:13:33 GMT+0600 (N. Central Asia Standard Time)] SignalR: Long poll complete.
[14:13:33 GMT+0600 (N. Central Asia Standard Time)] SignalR: LongPolling connected.
[14:13:33 GMT+0600 (N. Central Asia Standard Time)] SignalR: longPolling transport connected. Initiating start request.
[14:13:33 GMT+0600 (N. Central Asia Standard Time)] SignalR: Opening long polling request to 'https://example.com/signalr/poll?transport=longPolling&clientProtoco…rlCzGHl5kVLClT5ex8&connectionData=%5B%7B%22name%22%3A%22modemshub%22%7D%5D'.
[14:13:33 GMT+0600 (N. Central Asia Standard Time)] SignalR: The start request succeeded. Transitioning to the connected state.
[14:13:38 GMT+0600 (N. Central Asia Standard Time)] SignalR: Long poll complete.
[14:13:38 GMT+0600 (N. Central Asia Standard Time)] SignalR: Stopping connection.
[14:13:38 GMT+0600 (N. Central Asia Standard Time)] SignalR: Fired ajax abort async = true.

因此连接建立,5秒后中止(ConnectionTimeout等于110秒).并且这种模式一再重复.那太奇怪了.

解决方法

背景

根据Asp.net:

SignalR uses the transport API to create a transport connection,and the transport API depends on the existence of a physical network connection to create the transport connection. The transport connection ends when SignalR terminates it or when the transport API detects that the physical connection is broken.

Physical connections might be slow or there might be interruptions in connectivity. Depending on factors such as the length of the interruption,the transport connection might be dropped. SignalR then tries to re-establish the transport connection. Sometimes the transport connection API detects the interruption and drops the transport connection,and SignalR finds out immediately that the connection is lost. In other scenarios,neither the transport connection API nor SignalR becomes aware immediately that connectivity has been lost. For all transports except long polling,the SignalR client uses a function called keepalive to check for loss of connectivity that the transport API is unable to detect.

Troubleshooting

请注意,SignalR 2.1引入了保持活动以进行长轮询.如果某些事情干扰了分块的HTTP响应,这可能会有问题.如果要禁用keepalive功能,请将KeepAlive设置为null.长轮询传输会自动禁用Keepalive功能.

如果您是using a Self-Host,请使用以下3 args:

GlobalHost.Configuration.ConnectionTimeout = new TimeSpan(0,110);
GlobalHost.Configuration.DisconnectTimeout = new TimeSpan(0,30);
GlobalHost.Configuration.KeepAlive = new TimeSpan(0,10);

作为支持长时间轮询的保持“喜欢”功能的不同替代方法,请创建服务器方法名称Ping:

public class MyHub : Hub
{
    public void Ping()
    {
    }
}

然后,在客户端上创建一个用于Ping服务器的时间间隔:

var proxy = $.connection.myHub,intervalHandle;  
...
$.connection.hub.disconnected(function() {
    clearInterval(intervalHandle);
});  
...  
$.connection.hub.start().done(function() {
    // Only when long polling
    if($.connection.hub.transport.name === "longPolling") {
        // Ping every 10s
        intervalHandle = setInterval(function() {
            // Ensure we're connected (don't want to be pinging in any other state).
            if($.connection.hub.state === $.signalR.connectionState.connected) {
                proxy.server.ping().fail(function() {
                    // Failed to ping the server,we could either try one more time to ensure we can't reach the server
                    // or we could fail right here.
                    TryAndRestartConnection(); // Your method
                });
            }
        },10000); 
    }
});

我希望有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读