簡體   English   中英

如何使用 SignalR 事件以正確的方式保持連接活動?

[英]How to use SignalR events to keep connection alive in the right way?

我正在使用 SignalR、ASP.NET 和 C# 開發實時客戶端-服務器應用程序。 我使用 localhost 作為主機和 VS2013。

我的問題是:

  1. 為什么如果我關閉服務器,在網絡客戶端上會發生“重新連接”事件?

  2. “斷開連接”事件僅在40 秒以上發生。 如何減少這個時間?

  3. 我需要客戶端在啟動時連接到服務器。 “重新連接”事件應僅在固定時間間隔內發生。 如果“重新連接”間隔時間結束,客戶端應作為新客戶端連接。 如何存檔這個目標?

最后,我想問 - 如何以正確的方式使用SignalR保持活動連接?

我正在使用此代碼:

C#

public override Task OnDisconnected()
{
clientList.RemoveAt(nIndex);
Console.WriteLine("Disconnected {0}\n", Context.ConnectionId);
return (base.OnDisconnected());
}

public override Task OnReconnected()
{
Console.WriteLine("Reconnected {0}\n", Context.ConnectionId);
return (base.OnReconnected());
}

Javascript

$.connection.hub.reconnected(function () {
// Html encode display name and message.
var encodedName = $('<div />').text("heartbeat").html();
var now = new Date();

// Add the message to the page.
$('#discussion').append('Reconnected to server: ' + now + '</br>');
});

$.connection.hub.disconnected(function () {
// Html encode display name and message.
var encodedName = $('<div />').text("heartbeat").html();
var now = new Date();
// Add the message to the page.
$('#discussion').append('Disconnected from server: ' + now + '</br>');
});

連接輸出后:

message received from server : Fri Feb 21 2014 10:53:02

關閉服務器輸出后:

Reconnected to server: Fri Feb 21 2014 10:53:22 <-- Why, if i close server ???
Disconnected from server: Fri Feb 21 2014 10:53:53 <-- Why 40+ seconds after the server is closed ?

1.關閉服務器后,在 Web 客戶端上,“重新連接”事件發生,而“斷開連接”事件僅在此之后發生。 為什么?

SignalR 無法區分關閉服務器和重新啟動服務器之間的區別。 因此,當服務器關閉時,客戶端將開始嘗試重新連接,以防服務器實際重新啟動。

2. 在未知的“重新連接”之后30 秒以上發生“斷開連接”。 如何減少這個時間?

這個 30 秒超時可以通過DisconnectTimeout 屬性修改。

3. 我需要客戶端在啟動時連接到服務器。 “重新連接”應僅在固定時間間隔內發生。 如果“重新連接”間隔時間結束,客戶端應作為新客戶端連接。

您應該在斷開連接的事件上啟動連接,最好在超時后啟動連接,以減少服務器重新啟動時的負載。

$.connection.hub.disconnected(function() {
    setTimeout(function() {
        $.connection.hub.start();
    }, 5000); // Re-start connection after 5 seconds
});

SignalR文章中的整個理解和處理連接生命周期事件可能與您的問題有關。

此方法適用於不想更改服務器配置的情況; javascript 示例代碼:

connection.serverTimeoutInMilliseconds = 1000 * 60 * 10; // for  10 minute

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM