Всем привет,
Есть 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 сервиса?
Здравствуйте, debugx, Вы писали:
D>Всем привет,
D>Приходится вызывать тестовый пустой метод wcf-сервиса, ловить exception... Сейчас делаю так:
D>нет ли более адекватного способа делать реконнект после падения wcf сервиса?
А в чем заключается реконнект? Соединение устанавливается в момент вызова операции сервиса, и по окончании сразу же закрывается. Просто так соединение не держится открытым. Думаю, просто необходимо учитывать, что сервис может быть недоступен, и обрабатывать соответствующие исключения для всех вызовов операций сервиса.
Здравствуйте, 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 это просто ни куда не годится...
Здравствуйте, Visor2004, Вы писали:
V>Здравствуйте, debugx, Вы писали:
D>>нет ли более адекватного способа делать реконнект после падения wcf сервиса?
V>Я не смог найти в wcf вообще сколь-либо адекватного способа для прозрачного реконнекта разорванного соединения. У меня есть сессионный сервис, когда сессия отваливается по таймауту, допустим юзер отошел на 20 минут от компа, а потом пришел и нажал на кнопку, получаем исключение и надо соединяться снова, код принимает вот такой вот вид:
V>
Здравствуйте, dorofeevilya, Вы писали:
D>А в чем заключается реконнект? Соединение устанавливается в момент вызова операции сервиса, и по окончании сразу же закрывается.
с чего бы это (представь что у тебя сессия, идет несколько последовательных вызовов веб сервиса, и что на каждый call новое соединение открывать?), это зависит от транспортного уровня. D> Просто так соединение не держится открытым. Думаю, просто необходимо учитывать, что сервис может быть недоступен, и обрабатывать соответствующие исключения для всех вызовов операций сервиса.