Пользовательский HttpModule для IIS 7 для интеграции

#asp.net #iis-7 #httpmodule #integrated-pipeline-mode

#asp.net #iis-7 #httpmodule #интегрированный конвейерный режим

Вопрос:

У меня возникли проблемы с пользовательским обработчиком ошибок, который я создал. Это должен быть HttpModule , но когда я добавляю его в свой web.config тег system.webServer/modules , он не инициируется.

Это мой web.config раздел:

 <system.webServer>
  <modules>
    <add name="AspExceptionHandler" 
         type="Company.Exceptions.AspExceptionHandler, Company.Exceptions" 
         preCondition="managedHandler" />
  </modules>
</system.webServer>
  

Это код в моем HttpModule :

 using System;
using System.Web;
using Company.Settings;
using System.Configuration;

namespace Company.Exceptions
{
  public class AspExceptionHandler : IHttpModule
  {
    public void Dispose() { }

    public void Init(HttpApplication application)
    {
      application.Error  = new EventHandler(ErrorHandler);
    }

    private void ErrorHandler(object sender, EventArgs e)
    {
      HttpApplication application = (HttpApplication)sender;
      HttpContext currentContext = application.Context;

      // Gather information5
      Exception currentException = application.Server.GetLastError();
      String errorPage = "http://www.mycompaniesmainsite.com/error.html";

      HttpException httpException = currentException as HttpException;
      if (httpException == null || httpException.GetHttpCode() != 404)
      {          
        currentContext.Server.Transfer(errorPage, true);
      }
      else
      {
        application.Response.Status = "404 Not Found";
        application.Response.StatusCode = 404;
        application.Response.StatusDescription = "Not Found";
        currentContext.Server.Transfer(errorPage, true);
      }
    }
  }
}
  

Не мог бы кто-нибудь, пожалуйста, объяснить мне, что я делаю не так, и как работает режим интегрированного управляемого конвейера IIS 7? Потому что большинство ответов, которые я нашел, касаются настройки HttpModules для IIS 6.

Ответ №1:

Из того, что я вижу, вы на правильном пути. Вы убедились, что пул приложений вашего сайта настроен на режим управляемого конвейера?

Также, если вы тестируете это со встроенным веб-сервером Visual Studio (Cassini), то <system.webServer> раздел будет проигнорирован. Вам понадобится IIS7 или IIS7.5 Express, если вы хотите, чтобы модуль загружался оттуда.

Комментарии:

1. Спасибо за быстрый ответ, я установил пул приложений в режим управляемого конвейера. Я попробовал это с помощью IIS Express на своем локальном компьютере, и когда это не сработало, я опубликовал сайт на сервере с IIS 7. Там я мог видеть загружаемый модуль, но он никогда не запускался. Итак, я предполагаю, что это что-то еще, что я делаю неправильно…

2. Синтаксическая ошибка в моем web.config и некотором решении для очистки / сборки и публикации позже, похоже, работает…

3. @jonas не могли бы вы подробнее рассказать о проблемах web.config, которые вы обнаружили? Я сталкиваюсь с аналогичной проблемой и задаюсь вопросом, есть ли у меня такая же проблема, как у вас.

4. @theycallmemorty Извините, но то, что я сделал, было в основном методом проб и ошибок, поэтому я действительно не помню, что я сделал, чтобы решить эту проблему…

Ответ №2:

У меня была эта проблема, и я обнаружил, что отключение customErrors препятствовало запуску обработчика.

ie: это требуется в вашей конфигурации, чтобы событие ошибки было зафиксировано в HttpModule:

 <system.web>
    <customErrors mode="Off" />
</system.web>
  

Ответ №3:

Я столкнулся с той же проблемой обработчика, который не запускается, выполнение следующих изменений в приведенном выше коде помогло мне решить эту проблему. Вместо создания нового обработчика событий я просто прикрепил метод с той же подписью к этому событию.

 application.Error  = ErrorHandler;
  

Это работает для меня, все еще анализируя, в чем причина такого способа подключения обработчика, который работает в IIS7.