HttpModule и WCF (AspNetCompatibilityRequirementsMode.Allowed) - PullRequest
2 голосов
/ 10 февраля 2010

Я размещаю службы WCF на веб-странице Asp.net в режиме совместимости с ASP.NET ( AspNetCompatibilityRequirementsMode.Allowed ). Я написал простой HttpModule:

public class ExceptionInterceptor : IHttpModule
{
    public ExceptionInterceptor()
    {
    }

    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.Error += new EventHandler(context_Error);
    }

    void context_Error(object sender, EventArgs e)
    {
        // do something
    }
}

web.config:

<httpModules>
        <add name="ExceptionInterceptor" type="HttpModules.ExceptionInterceptor, HttpModules"/>
</httpModules>

У меня вопрос, почему после возникновения необработанного исключения в сервисе код не входит в функцию context_Error(object sender, EventArgs e) в моем модуле.

Более того, код даже не вводите Application_Error(object sender, EventArgs e) в Globals.asax . Кто-нибудь может мне это объяснить?

Каков наилучший вариант для глобальной обработки исключений в службах WCF?

Привет

1 Ответ

2 голосов
/ 12 февраля 2010

WCF не является ASP.NET - он может использовать некоторую инфраструктуру ASP.NET, но это не ASP.NET как таковой.

Чтобы обрабатывать ошибки в службе WCF в глобальном масштабе, вам необходимо реализовать интерфейс IErrorHandler в своей службе - или подключить поведение WCF, которое сделает это за вас.

Ознакомьтесь с MSDN документацией по IErrorHandler - на самом деле это довольно простой интерфейс. Метод HandleError обычно используется для регистрации ошибки на сервере для отслеживания происходящего, в то время как метод ProvideFault используется для преобразования исключения .NET на сервере в совместимую ошибку SOAP, чтобы отправить ее обратно вызывающий клиент (который может быть клиентом, отличным от .NET, который не может справиться с исключением, специфичным для .NET).

У Рори Примроуза есть отличное сообщение в блоге о том, как упаковать IErrorHandler в поведение сервиса WCF, которое вы можете легко добавить к существующему сервису только в конфигурации - довольно близко к магии :-) Зацените еще один отличный пост на тему от Стива Барбура.

...