提问人:LeXela-ED 提问时间:5/30/2016 更新时间:4/30/2019 访问量:10050
从客户端检测 SignalR 中丢失的连接
detecting connection lost in SignalR from client side
问:
我正在将一个简单的应用程序连接到托管我的 Web 应用程序的服务器。我的 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
}
答:
3赞
Quentin Roger
5/30/2016
#1
你可以尝试这样的事情:
来自 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);
}
评论
0赞
LeXela-ED
5/31/2016
谢谢。我使用了你的解决方案,但它没有用;当服务器关闭时,连接状态将更改为“已断开连接”。然后它尝试重新连接。过了一会儿,它连接了,但服务器无法检测到连接!:(
0赞
Quentin Roger
5/31/2016
我尝试了这个示例,它工作正常 code.msdn.microsoft.com/windowsdesktop/...,您可以在此处获取有关了解和处理 SignalR 中的连接生存期事件的详细信息:asp.net/signalr/overview/guide-to-the-api/...
0赞
Quentin Roger
5/31/2016
@NacerFarajzadeh 您是如何尝试重新启动连接的?
0赞
LeXela-ED
6/5/2016
实际上,我没有重新启动连接。我该怎么做?有什么安全的方法吗?
0赞
Quentin Roger
6/6/2016
@NacerFarajzadeh我用一种重新连接到 signalr 的方法编辑了我的答案
评论