В настоящее время мы обсуждаем, лучше ли выдавать ошибки через канал WCF, чем передавать сообщение, указывающее статус, или ответ от службы.
Ошибки имеют встроенную поддержку WCF, где вы можете использовать встроенные обработчики ошибок и реагировать соответствующим образом. Это, однако, сопряжено с накладными расходами, поскольку создание исключений в .NET может быть довольно дорогостоящим.
Сообщения могут содержать информацию, необходимую для определения того, что произошло с вызовом службы, без дополнительных затрат на создание исключения. Однако для анализа сообщения и определения действий, связанных с его содержанием, требуется несколько строк повторяющегося кода.
Мы предприняли попытку создать общий объект сообщения, который мы могли бы использовать в наших сервисах, и вот что мы придумали:
public class ReturnItemDTO<T>
{
[DataMember]
public bool Success { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public T Item { get; set; }
}
Если все мои служебные вызовы возвращают этот элемент, я могу постоянно проверять свойство «Успех», чтобы определить, все ли прошло хорошо. Затем у меня есть строка сообщения об ошибке в событии, указывающее, что что-то пошло не так, и общий элемент, содержащий Dto, если это необходимо.
Информация об исключении должна регистрироваться в центральной службе ведения журнала и не передаваться обратно из службы.
Мысли? Комментарии? Идеи? Предложения?
Дополнительные пояснения по моему вопросу
Проблема, с которой я сталкиваюсь с контрактами на сбой, заключается в передаче бизнес-правил.
Например, если кто-то входит в систему, а его учетная запись заблокирована, как мне сообщить об этом? Их логин, очевидно, не удался, но не по причине «Аккаунт заблокирован».
So do I:
A) используйте логическое значение, бросьте Fault с заблокированной учетной записью сообщения
Б) вернуть AuthenticatedDTO с соответствующей информацией