通知SignalR客户端IIS重启/关闭
本文关键字:关闭 重启 IIS SignalR 客户端 通知 | 更新日期: 2023-09-27 17:49:50
我有一个SignalR服务器(一个Web应用)和一个客户端(一个控制台应用)。
我希望我的客户端在我的服务器的IIS重新启动/关闭或服务器重新启动/关闭时都能收到通知。
有可能吗?
你可以这样做
var connection = new HubConnection(hubUrl);
if (configureConnection != null)
configureConnection(connection);
var proxy = connection.CreateHubProxy("EventAggregatorProxyHub");
connection.Reconnected += reconnected;
https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/blob/master/SignalR.EventAggregatorProxy.Client.DotNet/Bootstrap/Factories/HubProxyFactory.cs L17
其他事件
- 重新连接-在连接关闭后尝试重新连接时触发
- 关闭-当连接丢失时触发
更新:
Closed
将在重新连接失败时调用(当IIS关闭的时间超过重新连接超时所接受的时间时)。
这意味着您应该使用connection.Start()
从Close事件重新连接,当它失败时,关闭事件将被再次调用,并且可以使用connection.Start()
再次重试。
下面是一个使用我的代码的例子,它将在应用程序启动时IIS关闭以及运行
时IIS关闭时存活。public class HubProxyFactory : IHubProxyFactory
{
public IHubProxy Create(string hubUrl, Action<IHubConnection> configureConnection, Action<IHubProxy> onStarted, Action reconnected, Action<Exception> faulted, Action connected)
{
var connection = new HubConnection(hubUrl);
if (configureConnection != null)
configureConnection(connection);
var proxy = connection.CreateHubProxy("EventAggregatorProxyHub");
connection.Reconnected += reconnected;
connection.Error += faulted;
var isConnected = false;
Action start = () =>
{
Task.Factory.StartNew(() =>
{
try
{
connection.Start().Wait();
if(isConnected)
reconnected();
else
{
isConnected = true;
onStarted(proxy);
connected();
}
}
catch(Exception ex)
{
faulted(ex);
}
});
};
connection.Closed += start;
start();
return proxy;
}
}
我现在唯一的解决方案(非常印度jubaad虽然)是尝试重新连接到SignalR服务器每次在一定的时间间隔。
HubConnection _connection = new HubConnection(Properties.Settings.Default.UserLoginDataSource);
IHubProxy _hub;
void TryConnectingDataSource()
{
try
{
_connection.Stop();
_connection.Dispose();
_connection = new HubConnection(Properties.Settings.Default.UserLoginDataSource);
_connection.StateChanged += connection_StateChanged;
_hub = _connection.CreateHubProxy("myHub");
_connection.Start().Wait();
if (_connection.State == ConnectionState.Connected)
{
_hub.On("myHubCallback", new Action<Dictionary<string, Entities.Permissions.UserTypes>>(GetUserLoginList));
_hub.Invoke("myHubMethod");
}
}
catch (Exception x)
{
EventLogger.LogError(x);
}
}
如果我被Catch捕获,那就意味着连接有问题,很可能ISS坏了。