Мне пришлось реализовать собственный 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;
}
}