В моем предыдущем посте я рассмотрел некоторые основы создания и обработки исключений. В этом посте я собираюсь взглянуть на то, что происходит, когда возникает исключение во время удаленного вызова.
Remoting Call выбрасывает исключение
Для этого примера я настроил один объект на стороне сервера — опубликованный через общий интерфейс и зарегистрированный для удаленного взаимодействия .
public void ThrowApplicationException()
{
throw new ApplicationException("Message from the server");
}
Мой клиент — это приложение WinForms с глобальной обработкой исключений. Когда я вызываю метод, исключение генерируется на сервере и распространяется на клиент

Самое классное то, что я даже получаю полную трассировку стека — включая трассировку на сервере! Сервер и клиент также продолжают работать — исключение не вызвало сбой ни одного из процессов. Давайте посмотрим, что происходит, когда мы добавляем некоторые пользовательские исключения в микс.
Удаленный вызов, выбрасывающий пользовательское исключение
Для этого примера я создал 2 пользовательских исключения — первое находится в общей сборке (ссылка на сервер и клиент), а другое — только в серверной сборке. Они точно названы SharedException и ServerException .
Давайте посмотрим, что произойдет, когда мы создадим новое исключение ServerException .

Не совсем то, что мы хотели. Давайте посмотрим, что произойдет, когда мы создадимновое исключение SharedException .

Это больше походит на это. Поведение здесь имеет смысл: клиентское приложение получает сериализованную информацию для объекта ServerException, но не может знать, как десериализовать этот объект. Тип SharedException также необходимо пометить атрибутом Serializable — в противном случае эта операция не удалась бы подобным образом.
Резюме
Поведение удаленного взаимодействия по умолчанию (распространение исключений, возникающих на сервере) очень полезно, особенно в среде расширенного клиента. Вам просто нужно убедиться, что пользовательские исключения находятся в общей сборке и являются сериализуемыми — удаленное взаимодействие позаботится обо всем остальном.
К сожалению, мы не можем дублировать это поведение с приложениями WCF — SOA-природа WCF диктует, что все исключения необходимо перехватывать и распространять как ошибки (которые объявлены в контракте на обслуживание). Это одна из причин, почему удаленное взаимодействие, вероятно, лучше подходит для приложений с расширенными возможностями, чем WCF.
Удачного кодирования.
Свежие комментарии