Стратегии обработки исключений WCF
Мы разрабатываем прокси-сервер в WCF, который будет служить средством связи для некоторых карманных компьютеров, работающих с нашим пользовательским клиентским приложением. Мне любопытно, какие стратегии обработки ошибок используют люди, поскольку я бы предпочел не обматывать КАЖДЫЙ прокси-вызов в try/catch.
Когда я разрабатываю ASP.NET, я не занимаюсь большинством исключений, я использую Application_Error в Global asax, который затем может регистрировать исключение, отправлять электронную почту и перенаправлять пользователя на целевую страницу с ошибкой. То, что я ищу в WCF, похоже на это, за исключением того, что это позволит мне передать общий код ошибки клиенту из центра.
В принципе мне любопытно, как люди централизуют обработку исключений в приложениях WCF.
Спасибо
Ответы
Ответ 1
Вы можете найти здесь IErrorHandler интерфейс. Мы использовали это, чтобы в значительной степени упомянуть то, что вы упомянули, - централизованное ведение журнала исключений и предоставление обобщенных причин отказа, не забирая код многочисленными попытками/уловами, чтобы попытаться решить проблему локально.
Ответ 2
Итак, вот что я сделал. В нашем приложении есть несколько пользовательских исключений, таких как BusinessRuleException и ProcessException, WCF поддерживает как FaultException, так и FaultException<T>
.
Общей практикой является то, что вы всегда бросаете FaultException клиенту в случае общей ошибки или ошибки, которую вы не хотите отображать точно, что произошло. В других случаях вы можете передать FaultException<T>
, где T - класс с информацией о конкретном исключении.
Я создал эту концепцию Нарушений в приложении, что в основном означало, что любое пользовательское исключение имеет свойство, содержащее соответствующий экземпляр Violation. Затем этот экземпляр передавался клиенту, позволяя клиенту распознавать, когда произошла восстановительная ошибка.
Это решило часть проблемы, но я все еще хотел получить общий улов, который позволил бы мне централизовать ведение журнала. Я нашел это с помощью интерфейса IErrorHandle и добавления собственного обработчика ошибок в WCF. Вот код:
public class ServiceHostGeneralErrorHandler : IErrorHandler
{
public void ProvideFault(Exception ex, MessageVersion version, ref Message fault)
{
if (ex is FaultException)
return;
// a general message to the client
var faultException = new FaultException("A General Error Occured");
MessageFault messageFault = faultException.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, null);
}
public bool HandleError(Exception ex)
{
// log the exception
// mark as handled
return true;
}
}
Используя этот метод, я могу преобразовать исключение из того, что он хочет, к тому, что может быть легко отображено на клиенте, и в то же время регистрировать реальное исключение для ИТ-персонала. Пока этот подход работает достаточно хорошо и следует той же структуре, что и другие модули в приложении.
Ответ 3
Мы используем блок Application Exception Handling Application и защищаем большинство ошибок от клиентов, чтобы избежать раскрытия конфиденциальной информации, эта статья могла бы стать хорошей отправной точкой для вас, как и для "лучших практик" - вы должны использовать то, что подходит вашему домену.