Исключения в распределенной среде

В моем предыдущем посте я рассмотрел некоторые основы создания и обработки исключений. В этом посте я собираюсь взглянуть на то, что происходит, когда возникает исключение во время удаленного вызова.

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.

Удачного кодирования.

Author: admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *