Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В примере ExpectedExceptions показано, как перехватывать ожидаемые исключения при использовании типизированного клиента. Этот пример основан на руководстве «Начало работы», которое реализует сервис калькулятора. В этом примере клиентом является консольное приложение (.exe), а служба хостится с помощью Internet Information Services (IIS).
Замечание
Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.
В этом примере показано перехват и обработка двух ожидаемых типов исключений, которые должны обрабатывать программы: TimeoutException
и CommunicationException
.
Исключения, выбрасываемые методами коммуникации в Windows Communication Foundation (WCF) клиенте, могут быть ожидаемыми или неожиданными. Непредвиденные исключения включают катастрофические ошибки, такие как OutOfMemoryException
и ошибки программирования, например ArgumentNullException
или InvalidOperationException
. Обычно нет полезного способа обработки неожиданных ошибок, поэтому обычно их не следует перехватывать при вызове метода обмена данными клиента WCF.
Ожидаемые исключения из методов связи в клиенте WCF включают TimeoutException
, CommunicationException
, и любой производный класс от CommunicationException
. Они указывают на проблему во время обмена данными, которую можно безопасно обрабатывать, прервав клиент WCF и сообщить о сбое связи. Так как внешние факторы могут вызвать эти ошибки в любом приложении, правильные приложения должны перехватывать эти исключения и восстанавливаться при их возникновении.
Существует несколько производных CommunicationException
классов, которые клиент может вызвать. В некоторых случаях приложения также перехватывают некоторые из них для специальной обработки, а другие обрабатываются какCommunicationException
. Это можно сделать, сначала перехватив более конкретный тип исключения, а затем указав CommunicationException
в более позднем блоке catch.
Код, вызывающий метод обмена данными клиента, должен перехватывать TimeoutException
и CommunicationException
. Одним из способов обработки таких ошибок является прерывание клиента и сообщение об ошибке связи.
try
{
...
double result = client.Add(value1, value2);
...
client.Close();
}
catch (TimeoutException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
catch (CommunicationException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
Если возникает ожидаемое исключение, клиент может стать неиспользуемым после этого. Чтобы определить, можно ли по-прежнему использовать клиента, убедитесь, что свойство State
является CommunicationState
.открыто. Если он по-прежнему открыт, то он по-прежнему подходит для использования. В противном случае необходимо прервать клиент и освободить все ссылки на него.
Осторожность
Вы можете заметить, что клиенты, имеющие сеанс, часто становятся непригодными для использования после исключения, а клиенты, у которых нет сеанса, часто остаются пригодными для использования после исключения. Тем не менее, ни из них не гарантируется, поэтому если вы хотите продолжить использование клиента после исключения, приложение должно проверить State
свойство, чтобы убедиться, что клиент по-прежнему открыт.
При выполнении образца ответы и исключения операций отображаются в окне консоли клиента.
Клиентский процесс выполняет два сценария, каждый из которых пытается вызвать Add
, за которым следует Divide
. Первый сценарий имитирует сетевую проблему, прерывая клиента до совершения вызова к Divide
. Второй сценарий приводит к истечению времени ожидания, так как заданное время ожидания слишком коротко для завершения метода. Ниже представлен ожидаемый результат выполнения клиентского процесса.
Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.