Реконнект к wcf сервису
От: debugx Россия http://oignatov.blogspot.com
Дата: 28.10.10 10:56
Оценка:
Всем привет,
Есть wcf сервис, есть клиент, который его юзает.
При определенном запросе к wcf сервису, процесс, в котором сервис хостится и который представляет собой виндовую службу, может отвалиться. Там происходит обращение к unmanaged dll, и перехватить это падение нет возможности. Вин служба настроена так, чтобы самой перезапускаться.
После падения wcf сервиса клиент с заданным периодом пытается восстановить связь с wcf-сервисом. Но проблема в том, что объект прокси создается успешно, даже если wcf-сервис недоступен. Приходится вызывать тестовый пустой метод wcf-сервиса, ловить exception... Сейчас делаю так:
private static void Reconnect()
{
try
{
lock (_lock)
{
if (!IsOnline)
{
Debug.WriteLine("Trying to reconnect to the Test service");
_cePortalClient = new TestClient();
_cePortalClient.Test();
IsOnline = true;
}
}
}
catch (Exception)
{
IsOnline = false;
_cePortalClient = null;
}
}


нет ли более адекватного способа делать реконнект после падения wcf сервиса?
Re: Реконнект к wcf сервису
От: dorofeevilya Россия  
Дата: 28.10.10 11:33
Оценка:
Здравствуйте, debugx, Вы писали:

D>Всем привет,


D>Приходится вызывать тестовый пустой метод wcf-сервиса, ловить exception... Сейчас делаю так:


D>нет ли более адекватного способа делать реконнект после падения wcf сервиса?


А в чем заключается реконнект? Соединение устанавливается в момент вызова операции сервиса, и по окончании сразу же закрывается. Просто так соединение не держится открытым. Думаю, просто необходимо учитывать, что сервис может быть недоступен, и обрабатывать соответствующие исключения для всех вызовов операций сервиса.
Re: Реконнект к wcf сервису
От: Visor2004  
Дата: 28.10.10 11:35
Оценка:
Здравствуйте, debugx, Вы писали:

D>нет ли более адекватного способа делать реконнект после падения wcf сервиса?


Я не смог найти в wcf вообще сколь-либо адекватного способа для прозрачного реконнекта разорванного соединения. У меня есть сессионный сервис, когда сессия отваливается по таймауту, допустим юзер отошел на 20 минут от компа, а потом пришел и нажал на кнопку, получаем исключение и надо соединяться снова, код принимает вот такой вот вид:

      int i = 0;
      while ( i < 3 )
      {
        try
        {
          return serviceWrapper.AddTransfer ( source, target, comments, entries );
        }
        catch ( CommunicationException )
        {
          i++;
          Reconnect ( );
          continue;
        }
        catch ( Exception e )
        {
          HandleException ( e );
        }
      }
      return null;


И когда таких методов штук 30 это просто ни куда не годится...
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: Реконнект к wcf сервису
От: dorofeevilya Россия  
Дата: 28.10.10 11:44
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Здравствуйте, debugx, Вы писали:


D>>нет ли более адекватного способа делать реконнект после падения wcf сервиса?


V>Я не смог найти в wcf вообще сколь-либо адекватного способа для прозрачного реконнекта разорванного соединения. У меня есть сессионный сервис, когда сессия отваливается по таймауту, допустим юзер отошел на 20 минут от компа, а потом пришел и нажал на кнопку, получаем исключение и надо соединяться снова, код принимает вот такой вот вид:


V>
V>      int i = 0;
V>      while ( i < 3 )
V>      {
V>        try
V>        {
V>          return serviceWrapper.AddTransfer ( source, target, comments, entries );
V>        }
V>        catch ( CommunicationException )
V>        {
V>          i++;
V>          Reconnect ( );
V>          continue;
V>        }
V>        catch ( Exception e )
V>        {
V>          HandleException ( e );
V>        }
V>      }
V>      return null;
V>


V>И когда таких методов штук 30 это просто ни куда не годится...


А что вы делаете в Reconnect?
Re[3]: Реконнект к wcf сервису
От: Visor2004  
Дата: 28.10.10 11:54
Оценка:
Здравствуйте, dorofeevilya, Вы писали:

D>А что вы делаете в Reconnect?



    public void Reconnect ( )
    {
      try
      {
        CloseWrapper ( );
        if ( serviceWrapper == null )
          serviceWrapper = new TradeCenterServiceWrapper ( );
        serviceWrapper.Open ( );
        ConnectionState = ConnectorState.Connected;
      }
      catch
      {
        CloseWrapper ( );
        reconnectTimer.Change ( 120000, 120000 );
      }
    }
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: Реконнект к wcf сервису
От: cadet354 Россия
Дата: 28.10.10 12:29
Оценка:
Здравствуйте, dorofeevilya, Вы писали:

D>А в чем заключается реконнект? Соединение устанавливается в момент вызова операции сервиса, и по окончании сразу же закрывается.

с чего бы это (представь что у тебя сессия, идет несколько последовательных вызовов веб сервиса, и что на каждый call новое соединение открывать?), это зависит от транспортного уровня.
D> Просто так соединение не держится открытым. Думаю, просто необходимо учитывать, что сервис может быть недоступен, и обрабатывать соответствующие исключения для всех вызовов операций сервиса.
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.