【发布时间】:2011-02-14 20:25:39
【问题描述】:
我必须实现一个自定义 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 会更好吗?
更新
我在共享点环境之外尝试过这个,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;
}
}
【问题讨论】:
-
你的 web.config 是什么样子的?对我来说,更改
Response.StatusCode将使 IIS7 丢弃整个响应并返回处理错误,使我所有的自定义错误处理代码都是徒劳的。 -
@asbjornu - 除了添加 httpModule 之外,我没有对 web.config 进行任何更改
-
这很奇怪。每当我设置
Response.StatusCode时,IIS7 都会接管整个响应并呈现它自己的自定义错误处理内容。 -
您在使用共享点吗? Sharepoint 有大量模块可以跳入管道,因此它与普通的 .net 应用程序不同。
-
我没有使用 SharePoint,没有。
标签: c# asp.net sharepoint httpmodule