#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.