Вариант 3. Базовое исключение либо уже поддерживает удаленное взаимодействие, либо вы извлекаете из него добавление удаленное взаимодействие.
«Исключение», которое Марк упоминает в комментарии, выглядит следующим образом; Я думаю, что это не то, что имели в виду авторы тестов:
В службе WCF вы можете разрешить распространению необработанного исключения из службы. WCF превратит его в сбой SOAP, который может содержать или не содержать сведения о необработанном исключении в зависимости от конфигурации.
Лучше было бы распознавать определенные наборы исключений и преднамеренно переводить их в ошибки SOAP. Например, служба, которая работает с объектами базы данных, может ожидать, что иногда объект не будет найден; иногда попытка добавить новый объект может привести к дублированию; иногда попытка обновления привела бы к неверному состоянию. Такой сервис может решить выставить NotFoundFault
, DuplicateItemFault
и InvalidStateFault
.
Служба будет определять три ошибки как контракты данных для определения их содержимого:
[DataContract]
public class FaultBase {
[DataMember]
public string ErrorMessage {get;set;}
}
[DataContract]
public class NotFoundFault : FaultBase {
[DataMember]
public int EntityId {get;set;}
}
[DataContract]
public class DuplicateItemFault : FaultBase {
[DataMember]
public int EntityId {get;set}
}
[DataContract]
public class InvalidStateFault : FaultBase {
}
Затем вы указали бы, что определенные операции могут возвращать такие ошибки:
[OperationContract]
[FaultContract(typeof(NotFoundFault))]
public Entity GetEntityById(int id)
Наконец, вы можете обернуть исключение из DAL таким образом, чтобы WCF вместо этого возвращал конкретную ошибку:
try {
return DAL.GetEntity<Entity>(id);
}
catch (DAL.NoSuchEntityException ex)
{
throw new FaultException<NotFoundFault>(
new NotFoundFault {EntityId = ex.Id, ErrorMessage = "Can't find entity"});
}
Я думаю, что разработчик теста пытался заставить вас подумать, что нужно сделать что-то особенное, чтобы сериализовать исключение для удаленного взаимодействия с другим доменом приложения. Это не будет иметь место, если пользовательское исключение было правильно реализовано, так как все поставляемые классы исключений .NET все сериализуемы. Таким образом, возможность сериализации не является оправданием для создания пользовательского исключения, поскольку базовый класс уже должен быть сериализуемым.