通知SignalR IIS重启/关闭客户端

时间:2015-05-19 14:42:30

标签: c# .net iis signalr

我有一个SignalR服务器(一个Web应用程序)和一个客户端(一个控制台应用程序)。

我希望每当我的服务器的IIS重新启动/关闭或服务器重新启动/关闭时,都会通知我的客户端。

有可能吗?

2 个答案:

答案 0 :(得分:4)

你可以这样做

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()从关闭事件重新连接,将再次调用已关闭事件,并可以使用connection.Start()重新尝试。

以下是使用我的代码的一个示例,它将在应用程序启动时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;
    }
}

答案 1 :(得分:0)

我现在唯一的解决方案(非常多的印度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抓住,那将意味着Connection出现问题,很可能ISS已经失效。