Server.TransferRequest()和http状态码

我必须实现一个自定义的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;
    }
}

那么,TransferRequest()会触发一个新的请求,这意味着一个新的响应。 由于PageNotFoundUrl指向的资源确实存在,客户端会收到合法的200 OK状态标头。

您可能需要编写HTTP处理程序(或在Global.asax中处理事件),以便在为PageNotFoundUrl提供服务时强制将状态标题设为404 Not Found


Server.TransferRequest不会更改状态码。 它将请求的控制传递给另一个页面而不告诉客户端。 您可以在Page_Load事件中手动设置您的自定义404页面中的状态代码:

protected void Page_Load(object sender, System.EventArgs e)
{
    Response.StatusCode         = 404;
    Response.StatusDescription  = "Not Found";
}
链接地址: http://www.djcxy.com/p/50847.html

上一篇: Server.TransferRequest() and the http status code

下一篇: SSRS: How to set Multiple Values on ParameterValue object?