检测来自客户端的SignalR中丢失的连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检测来自客户端的SignalR中丢失的连接相关的知识,希望对你有一定的参考价值。

我正在将一个简单的应用程序连接到托管我的web-pplication的服务器。我的Web应用程序使用SignalR 2.一切顺利,我的小应用程序可以与Web应用程序同步并接收从它发送的消息。但是,当更新网页或服务器重新启动并且它失去连接时,应用程序无法理解连接是否从服务器丢失。以下是我的代码:

// initializing connection
HubConnection connection;
IHubProxy hub;

connection = new HubConnection(serverAddress);
hub = connection.CreateHubProxy("MyPanel");
hub.On<string>("ReciveText", (msg) => recieveFromServer(msg));

线程每1分钟检查一次连接,但每次检查时,连接状态为“已连接”,而服务器端的连接丢失。这里有什么我想念的吗?

if (connection.State == ConnectionState.Disconnected)
{
    // try to reconnect to server or do something
}
答案

你可以试试这样的东西:

来自signalR的官方例子。

connection = new HubConnection(serverAddress);    
connection.Closed += Connection_Closed;

/// <summary>
/// If the server is stopped, the connection will time out after 30 seconds 
/// the default, and the `Closed` event will fire.
/// </summary>
void Connection_Closed()
{
 //do something
}

您可以像这样使用StateChanged事件:

connection.StateChanged += Connection_StateChanged;

private void Connection_StateChanged(StateChange obj)
{
      MessageBox.Show(obj.NewState.ToString());
}

编辑

您可以尝试使用类似的方式每15秒重新连接一次:

private void Connection_StateChanged(StateChange obj)
{

    if (obj.NewState == ConnectionState.Disconnected)
    {
        var current = DateTime.Now.TimeOfDay;
        SetTimer(current.Add(TimeSpan.FromSeconds(30)), TimeSpan.FromSeconds(10), StartCon);
    }
    else
    {
        if (_timer != null)
            _timer.Dispose();
    }
}

private async Task StartCon()
{
    await Connection.Start();
}

private Timer _timer;
private void SetTimer(TimeSpan starTime, TimeSpan every, Func<Task> action)
{
    var current = DateTime.Now;
    var timeToGo = starTime - current.TimeOfDay;
    if (timeToGo < TimeSpan.Zero)
    {
        return;
    }
    _timer = new Timer(x =>
    {
        action.Invoke();
    }, null, timeToGo, every);
}

以上是关于检测来自客户端的SignalR中丢失的连接的主要内容,如果未能解决你的问题,请参考以下文章

SignalR:检测客户端上的连接状态

SignalR:服务器如何建立与客户端的连接?

在重新连接时检测丢失的消息/对消息的丢失操作

在 SQL Server 中检测客户端的断开连接

如何从SignalR客户端端确定服务器断开连接

获取连接到 SignalR 集线器的侦听器和客户端的数量