Подтвердить что ты не робот

Стратегии обработки исключений WCF

Мы разрабатываем прокси-сервер в WCF, который будет служить средством связи для некоторых карманных компьютеров, работающих с нашим пользовательским клиентским приложением. Мне любопытно, какие стратегии обработки ошибок используют люди, поскольку я бы предпочел не обматывать КАЖДЫЙ прокси-вызов в try/catch.

Когда я разрабатываю ASP.NET, я не занимаюсь большинством исключений, я использую Application_Error в Global asax, который затем может регистрировать исключение, отправлять электронную почту и перенаправлять пользователя на целевую страницу с ошибкой. То, что я ищу в WCF, похоже на это, за исключением того, что это позволит мне передать общий код ошибки клиенту из центра.

В принципе мне любопытно, как люди централизуют обработку исключений в приложениях WCF.

Спасибо

4b9b3361

Ответ 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 и защищаем большинство ошибок от клиентов, чтобы избежать раскрытия конфиденциальной информации, эта статья могла бы стать хорошей отправной точкой для вас, как и для "лучших практик" - вы должны использовать то, что подходит вашему домену.