【问题标题】:How to programmatically serve HTTP 404 from ASP.NET code-behind and redirect to 404 page?如何以编程方式从 ASP.NET 代码隐藏提供 HTTP 404 并重定向到 404 页面?
【发布时间】:2012-07-19 21:09:26
【问题描述】:

我有一个 ASP.NET 应用程序,如果找不到请求的内容,它有时会重定向到 404 页面。这样做是这样的:

var data = MyDatabase.RetrieveData(dataID);
if (data == null)
   Response.Redirect("~/My404Page.aspx");

这对用户来说非常有用。但这会导致302 Found(重定向),而不是404 Not Found,这对于搜索爬虫来说并不理想。我想返回一个 404 状态代码,并且仍然向用户显示有用的内容。

著名的internet's most awkard 404 page 就是这样做的;如果您在该域中输入错误的 URL 并使用 Fiddler 之类的内容查看结果,您实际上会得到一个 404 代码。

我试过这个:

Response.StatusCode = 404;

这会正确设置 404 代码,但会继续呈现页面。我也试过这个:

throw new HttpException(404, "Not Found");

但这与任何其他未捕获的异常一样(通过302 重定向到服务器错误页面)。

我想出了一种方法来通过一些自定义逻辑在我的应用程序中解决这个问题,这些逻辑涉及自己设置状态代码并编写一个 JavaScript 重定向到响应。但我想要的是一种在代码隐藏中表达该请求应该停止处理并重定向到 404 错误页面(我相信可以在 IIS 或 web.config 中指定)的方法。这可能吗?

【问题讨论】:

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


    【解决方案1】:

    如果您不希望 302 重定向,则需要执行 Server.Transfer 而不是 Repsonse.Redirect。 Response.Redirect() 将响应发送回浏览器,告诉它加载您的 ~/My404Page.aspx。 Server.Transfer() 将控制权转移到您的 ~/My404Page.aspx 而无需返回浏览器,这意味着您的浏览器不会收到 302 重定向消息。

    您还需要确保在 404 页面上将 Response.StatusCode 属性设置为 404。

    或者,如果您抛出 HttpException,您可以通过设置 redirectMode property to ResponseRewrite 重定向到您的自定义 404 页面,而无需在服务器中执行 302。这仅适用于较新版本的 ASP.NET。

    【讨论】:

      【解决方案2】:

      在您的网络应用程序的web.config 中使用CustomErrors 属性:

      <configuration>
        <system.web>
          <customErrors defaultRedirect="GenericError.htm"
                        mode="RemoteOnly">
            <error statusCode="404"
                   redirect="My404Page.aspx"/>
          </customErrors>
        </system.web>
      </configuration>
      

      【讨论】:

        猜你喜欢
        • 2012-05-28
        • 2016-02-28
        • 2018-10-20
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 2016-01-06
        相关资源
        最近更新 更多