404 page response.redirect vs server.transfer

时间:2009-08-14 17:24:08

标签: asp.net http-status-code-404

在ASP.NET中处理404错误时,可以设置404错误以重定向到将404响应代码发送到浏览器的页面,或者应该使用server.transfer以便404头文件可以发送到浏览器网址保持不变?

4 个答案:

答案 0 :(得分:3)

customErrors statusCode =“404”会产生302临时重定向,然后是404(如果您在404页面的代码中设置了该重定向)。

因此,以下内容应该在您的global.asax或错误HttpModule中为您执行:

    protected void Application_Error(Object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        if (exception is HttpUnhandledException)
        {
            if (exception.InnerException == null)
            {
                Server.Transfer(ERROR_PAGE_LOCATION, false);
                return;
            }
            exception = exception.InnerException;
        }

        if (exception is HttpException)
        {
            if (((HttpException)exception).GetHttpCode() == 404)
            {
                Server.ClearError();
                Server.Transfer(NOT_FOUND_PAGE_LOCATION);
                return;
            }
        }

        if (Context != null && Context.IsCustomErrorEnabled)
            Server.Transfer(ERROR_PAGE_LOCATION, false);
        else
            Log.Error("Unhandled exception trapped in Global.asax", exception);
    }

编辑:哦,Best way to implement a 404 in ASP.NET让我走上了命令式Server.ClearError();

请参阅http://www.andornot.com/blog/post/Handling-404-errors-with-ASPNET.aspx,了解我所做的所有内容。

答案 1 :(得分:2)

我会使用web.config的customerrors部分,然后您可以指定要转到的页面。

<configuration>
    <system.web>
        <customErrors mode="On" defaultRedirect="Error.aspx">
            <error statusCode="404" redirect="404Error.aspx" />
        </customErrors>
    </system.web>
</configuration>

在接收页面上,如果您仍想发送404,可以将其放在page_load事件中:

Response.Status = "404 Not Found";

答案 2 :(得分:1)

Response.Redirect将在重定向页面上首先执行302而不是404。 Server.Transfer将保留URL,因此在请求的页面上为404。

我认为这一切都归结为SEO。我建议使用Server.Transfer,因为浏览器/搜索引擎更清楚的是找不到请求的URL。如果您使用Response.Redirect请求页面被“临时”重定向到未找到的页面。那不好...... 302不是个好主意。

答案 3 :(得分:0)

我的建议是让ASP.NET进程根据你的web.config为你工作,但如果你真的想在代码中使用它,你应该坚持使用Server.Transfer,因为它会为你节省回发。< / p>