Восстановление после исключения CommunicationObjectFaultedException в WCF
Вопрос
У меня есть клиентское приложение, которое каждые 10 секунд пытается отправить сообщение через веб-службу WCF.Это клиентское приложение будет установлено на компьютере на борту корабля, который, как мы знаем, будет иметь нестабильное подключение к Интернету.Я бы хотел, чтобы приложение попыталось отправить данные через службу, а если оно не сможет, то поставило сообщения в очередь до тех пор, пока оно не сможет отправить их через службу.
Чтобы протестировать эту настройку, я запускаю клиентское приложение и веб-сервис (оба на локальном компьютере), и все работает нормально.Я пытаюсь имитировать плохое подключение к Интернету, убивая веб-службу и перезапуская ее.Как только я завершаю службу, я начинаю получать CommunicationObjectFaultedExceptions, что и ожидалось.Но после перезапуска службы я продолжаю получать эти исключения.
Я почти уверен, что есть что-то, чего я не понимаю в парадигме веб-сервисов, но я не знаю, что это такое.Может ли кто-нибудь дать совет о том, возможна ли такая установка, и если да, то как решить эту проблему (т.восстановить канал связи с веб-сервисом)?
Спасибо!
Клэй
Решение
Прокси-серверы службы клиентов не могут быть повторно использованы после того, как они вышли из строя.Вы должны избавиться от старого и воссоздать новый.
Вы также должны убедиться, что вы правильно закрыли прокси-сервер службы клиента.Прокси-сервер службы WCF может выдать исключение при закрытии, и если это произойдет, соединение не будет закрыто, поэтому необходимо прервать его.Используйте шаблон «try{Close}/catch{Abort}».Также имейте в виду, что метод Dispose вызывает close (и, следовательно, может вызвать исключение из Dispose), поэтому вы не можете просто использовать using Like с обычными одноразовыми классами.
Например:
try
{
if (yourServiceProxy != null)
{
if (yourServiceProxy.State != CommunicationState.Faulted)
{
yourServiceProxy.Close();
}
else
{
yourServiceProxy.Abort();
}
}
}
catch (CommunicationException)
{
// Communication exceptions are normal when
// closing the connection.
yourServiceProxy.Abort();
}
catch (TimeoutException)
{
// Timeout exceptions are normal when closing
// the connection.
yourServiceProxy.Abort();
}
catch (Exception)
{
// Any other exception and you should
// abort the connection and rethrow to
// allow the exception to bubble upwards.
yourServiceProxy.Abort();
throw;
}
finally
{
// This is just to stop you from trying to
// close it again (with the null check at the start).
// This may not be necessary depending on
// your architecture.
yourServiceProxy = null;
}
Об этом есть статья в блоге здесь