Как я могу сгенерировать ответ 404 из IHttpModule, настроенного в глобальном web.config? - PullRequest
3 голосов
/ 31 марта 2011

Я пытаюсь сгенерировать 404 для определенных запросов на всех сайтах на сервере на основе настроенных HttpRequest.UserAgent.

.IHttpModule в глобальном web.config сервера, содержащем код ниже:

private void Application_BeginRequest(Object source, EventArgs e)
{
    HttpApplication application = (HttpApplication)source;
    HttpContext context = application.Context;

    if (isBot(context.Request.UserAgent))
    {
        System.Diagnostics.EventLog.WriteEntry(
            "Application",
            "\nBotRequestChecker -- request 404d\n" + "Url: " + 
              context.Request.Url + "\nUserAgent: " + context.Request.UserAgent,
            EventLogEntryType.Information);
        context.Response.StatusCode = 404;
        context.Response.StatusDescription = "Not Found";
        context.ApplicationInstance.CompleteRequest();
    }
}

Установка User-Agent в браузере и посещение страницы приводит к записи в журнале событий, но страницатакже вернулся, без статуса 404.

Есть мысли о том, что мне не хватает?

Обновление:

IHttpModule, похоже, действительносработает, если я добавлю его на один сайт (в web.config сайта), но не на все сайты.

Обновление 2: IHttpModule работает только на одном сайте всервер IIS7 , не включенный IIS6 .

1 Ответ

0 голосов
/ 31 марта 2011

Убедитесь, что вы подписались на событие BeginRequest в реализации IHttpModule.Init() вашего модуля. События не имеют автоматической проводки в реализациях IHttpModule так же, как в Global.asax.

Сначала я также немного упустил информацию о глобальном web.config.

На 64-разрядном сервере вам необходимо убедиться, что вы вносите изменения как в 32-, так и в 64-разрядные конфигурации (в зависимости от разрядности, на которой работают ваши сайты) во всех версиях ASP.NET, которые вы используете. необходимо поддержать:

%windows%\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
%windows%\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config

%windows%\Microsoft.NET\Framework\v4.0.30319\CONFIG\web.config
%windows%\Microsoft.NET\Framework64\v4.0.30319\CONFIG\web.config

Если вы нацеливаетесь как на IIS6, так и на IIS7, вам нужно убедиться, что на модуль ссылаются как элемент <system.web>/<httpModules> для IIS6, так и элемент <system.webServer>/<modules> для IIS7.

...