Server.TransferRequest () и код состояния http - PullRequest
7 голосов
/ 14 февраля 2011

Мне пришлось реализовать собственный HttpModule для обработки ошибки 404 в Sharepoint.

Он прослушивает событие PreSendRequestContent и ищет код состояния 404. Если он найден, он выполняет TransferRequest.

void App_PreSendRequestContent(object sender, EventArgs e)
{
    HttpResponse res = App.Response;
    HttpRequest req = App.Request;

    if (res.StatusCode == 404 && !req.Url.AbsolutePath.Equals(PageNotFoundUrl, StringComparison.InvariantCultureIgnoreCase))
    {
        App.Server.TransferRequest(PageNotFoundUrl);
    }
}

Это работает просто отлично, но я заметил в Fiddler, что на странице отображается код состояния 200, хотя исходный запрос был 404. Это не хорошо для поисковых систем.

Это ожидаемое поведение TransferRequest ? Можно ли как-то поддерживать код состояния 404? Или мне лучше использовать старый добрый Server.Transfer?

Обновление

Я пробовал это вне среды sharepoint, и запрос Server.TransferRequest действительно дает код состояния 200, удаляя 404. Server.Transfer не работает, так как я не думаю, что это может дать конвейер.

Обновление 2

Благодаря ответу ниже я добавил следующее:

void App_PostRequestHandlerExecute(object sender, EventArgs e)
{
    HttpResponse res = App.Response;
    HttpRequest req = App.Request;

    if (req.Url.AbsolutePath.Equals(PageNotFoundUrl, StringComparison.InvariantCultureIgnoreCase))
    {
        res.StatusCode = 404;
    }
}

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

Ну, TransferRequest () запускает новый запрос, который подразумевает новый ответ.Поскольку ресурс, на который PageNotFoundUrl указывает , существует , клиент получает допустимый заголовок статуса 200 OK.

Возможно, вы захотите написать обработчик HTTP (или обработать событие в Global.asax ), чтобы при отправке PageNotFoundUrl.

заголовок состояния был равен 404 Not Found.
2 голосов
/ 15 февраля 2011

Server.TransferRequest не меняет код состояния. Он передает управление запросом на другую страницу, не сообщая об этом клиенту. Вы можете вручную установить код состояния на своей пользовательской странице 404 в событии Page_Load:

protected void Page_Load(object sender, System.EventArgs e)
{
    Response.StatusCode         = 404;
    Response.StatusDescription  = "Not Found";
}
...