2015-05-19 6 views
3

У меня есть сервер SignalR (Веб-приложение) и Клиент (Консольное приложение).Уведомлять SignalR Клиенты IIS перезапуск/завершение работы

Я хочу, чтобы мой Клиент (ы) уведомлялся, когда IIS моего сервера перезагружается/завершается, или сервер просто перезагружается/выключается.

Возможно ли это?

+0

Вы хотите перезагрузить весь сервер IIS или только рабочий процесс вашего приложения? –

+0

Как триггер запланированной задачи или [служба Windows] (http://forums.iis.net/t/1180869.aspx?IIS+Windows+Service)? – lloyd

+0

@AliHasan, я считаю, что оба будут такими же, но я больше знаю о перезагрузке рабочего процесса. – yogi

ответ

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 - сгорело, когда соединение теряется

Update:

Closed будет вызываться при повторном подключении не удалось (Когда IIS был вниз в течение более длительного периода, чем принятый Reconnect тайм-аут).

Это означает, что вы должны повторно подключиться к событию Close, используя 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; 
    } 
} 
+0

Я считаю, что Reconnected будет работать только тогда, когда/if iss загрузится после перезапуска. Я хочу сообщить, когда он погаснет. Не было упомянуто в вопросе извините. Будет обновляться. – yogi

+0

См. Обновление пожалуйста – Anders

+0

Закрыто кажется перспективным, может работать. Спасибо, я попробую это. Будет принимать, если это работает :) – yogi

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 не работает.

Смежные вопросы