我不得不实现一个自定义的HttpModule来处理Sharepoint中的404错误。
它监听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;
}
}
Response.StatusCode
会使 IIS7 放弃整个响应并返回处理错误,使我所有自定义错误处理代码都无用。 - Asbjørn UlsbergResponse.StatusCode
时,IIS7就会接管整个响应并呈现自己的自定义错误处理内容。 - Asbjørn Ulsberg