Обработка html-файлов с помощью HttpModule для обнаружения 404 ошибок на IIS7 - PullRequest
4 голосов
/ 11 мая 2011

У меня другая проблема с моим HttpModule, который обрабатывает исключения.(см. мой предыдущий пост: Пользовательский HttpModule для IIS 7 для интегрированных )

Все работает хорошо, но только для страниц aspx.

Основная причина, по которой мыхотел использовать этот HttpModule для обработки 404 исключений, которые возникают, когда кто-то пытается перейти на HTML-страницу, которая не существует.Но мой HttpModule работает только для страниц .aspx и не запускается, когда HTML-файл не существует.

Это конфигурация, которую я настроил в своем файле web.conf:

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

Я также пытался добавить 'runAllManagedModulesForAllRequests = "true"' к узлу модуля и preCondition = "managedHandler" "к узлу" добавления ", но это также не сработало.

Я установил пул приложений, в котором запущено мое веб-приложение, в режим "Интегрирован", потому что я нашел это много в Google.

Есть ли другой способ сделать мой HttpModule ручнымисключения, возникающие при посещении несуществующей html страницы?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

Проведя небольшое исследование, основанное на ответе Александра, я также реализовал IHttpHandler в своем AspExceptionHandler.

Мой класс теперь выглядит следующим образом:

public class AspExceptionHandler : IHttpModule, IHttpHandler
    {
        public void Dispose() { }

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

        private void ErrorHandler(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            try
            {
                // Gather information
                Exception currentException = application.Server.GetLastError(); ;
                String errorPage = "http://companywebsite.be/error.aspx";

                HttpException httpException = currentException as HttpException;
                if (httpException == null || httpException.GetHttpCode() != 404)
                {
                    application.Server.Transfer(errorPage, true);
                }
                //The error is a 404
                else
                {
                    // Continue
                    application.Server.ClearError();

                    String shouldMail404 = true;

                    //Try and redirect to the proper page.
                    String requestedFile = application.Request.Url.AbsolutePath.Trim('/').Split('/').Last();

                    // Redirect if required
                    String redirectURL = getRedirectURL(requestedFile.Trim('/'));
                    if (!String.IsNullOrEmpty(redirectURL))
                    {
                        //Redirect to the proper URL
                    }
                    //If we can't redirect properly, we set the statusCode to 404.
                    else
                    {
                        //Report the 404
                    }
                }
            }
            catch (Exception ex)
            {
                ExceptionCatcher.FillWebException(HttpContext.Current, ref ex);
                ExceptionCatcher.CatchException(ex);
            }
        }

        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            if (!File.Exists(context.Request.PhysicalPath)) 
            {
                throw new HttpException(404, String.Format("The file {0} does not exist", context.Request.PhysicalPath));
            }
                    else
            {
                context.Response.TransmitFile(context.Request.PhysicalPath);
            }
        }
    }

В методе ProcessRequest (требуется IHttpHandler) Я проверяю, существует ли файл.Если он не существует, я выбрасываю исключение HttpException, которое перехватывается частью HttpModule моего класса.

Узел system.webServer в моем web.config теперь выглядит следующим образом:

<modules runAllManagedModulesForAllRequests="true">
            <add name="AspExceptionHandler" type="Company.Exceptions.AspExceptionHandler, Company.Exceptions" preCondition="managedHandler" />
        </modules>
        <handlers>
            <add name="AspExceptionHandler" type="Company.Exceptions.AspExceptionHandler, Company.Exceptions" verb="*" path="*.html" />
        </handlers>

Я нашел ответ в этом посте: HttpHandler запускается, только если файл не существует

1 голос
/ 11 мая 2011

вы можете попробовать это

<httpHandlers>
    <add type="Company.Exceptions.AspExceptionHandler, Company.Exceptions" verb="*" path="*"/> 
    ....
</httpHandlers>

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

...