ASP.NET 404 httpmodule - PullRequest
       14

ASP.NET 404 httpmodule

2 голосов
/ 06 февраля 2012

Я использую продукт CMS под названием EPiServer. Нам нужно создать наш собственный метод отображения 404, который просто не может быть достигнут с помощью стандартных пользовательских ошибок .NET. Мы написали модуль, который мы используем для проверки на HttpStatusCode. Мы делаем это в методе EndRequest.

Если статус 404, мы запрашиваем у EPiServer соответствующую страницу 404, а затем переносим запрос на эту страницу. Однако это не возвращает 404, и даже если я делаю следующее, правильный статус не возвращается:

HttpContext.Current.Response.StatusCode = 404;
HttpContext.Current.Response.StatusDescription = "Page not Found";
HttpContext.Current.Server.TransferRequest(newPage);

Аналогичным образом, если вместо TransferRequest я делаю response.redirect, то это не правильный 404, потому что URL изменился ...

Как правильно это сделать?

Спасибо заранее Al

Ответы [ 5 ]

1 голос
/ 06 февраля 2012

Какую версию IIS вы используете?Для IIS7 или 7.5 вам может понадобиться что-то вроде этого:

<httpErrors errorMode="Custom">
        <remove statusCode="404" />
        <error statusCode="404" path="/somenotfoundpage.aspx" responseMode="ExecuteURL" />
        <remove statusCode="500" />
        <error statusCode="500" path="/someerrorpage.aspx" responseMode="ExecuteURL" />
</httpErrors>
1 голос
/ 06 февраля 2012

Не прямой ответ на ваш вопрос, но также можно взглянуть на этот обработчик с открытым исходным кодом 404: https://www.coderesort.com/p/epicode/wiki/404Handler

Он также доступен на нисходящей ленте episervers

0 голосов
/ 06 февраля 2012

Спасибо за ваши ответы.

Я действительно получил эту работу, выполнив следующее:

В обработчике событий EndRequest я перенес запрос на правильную страницу EPiServer и включил параметр строки запроса в вызов, т. Е.

app.Context.Server.TransferRequest (pageUrl + "& internal = true");

Затем в событии PostRequestHandlerExecute я проверяю параметр строки запроса, если он существует, он может быть только потому, что это 404, поэтому я возвращаю правильный статус:

HttpContext.Current.Response.StatusCode = 404; HttpContext.Current.Response.StatusDescription = "Страница не найдена";

Работает как шарм.

Спасибо higgsy

0 голосов
/ 06 февраля 2012

Попробуйте установить код состояния на странице, на которую вы переводите - в шаблоне страницы с ошибкой. Я не уверен, что наличие отдельного модуля необходимо - вы можете просто обработать событие Error HttpApplication в Global.asax.cs.

0 голосов
/ 06 февраля 2012

Вы должны установить код состояния в коде позади шаблона, который вы используете для своей страницы 404.

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

...