在ASP.NET中实现404的最佳方法

时间:2009-03-20 17:01:42

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

我正在尝试确定在标准ASP.NET Web应用程序中实现404页面的最佳方法。我目前在Global.asax文件中的Application_Error事件中捕获404错误,并重定向到友好的404.aspx页面。问题是请求看到302重定向,然后缺少404页面。有没有办法绕过重定向并使用包含友好错误消息的直接404进行响应?

Googlebot等网络抓取工具是否关心非现有页面的请求是否返回302后跟404?

9 个答案:

答案 0 :(得分:43)

在Global.asax的OnError事件中处理:

protected void Application_Error(object sender, EventArgs e){
  // An error has occured on a .Net page.
  var serverError = Server.GetLastError() as HttpException;

  if (serverError != null){
    if (serverError.GetHttpCode() == 404){
      Server.ClearError();
      Server.Transfer("/Errors/404.aspx");
    }
  }
}

在错误页面中,您应该确保正确设置状态代码:

// If you're running under IIS 7 in Integrated mode set use this line to override
// IIS errors:
Response.TrySkipIisCustomErrors = true;

// Set status code and message; you could also use the HttpStatusCode enum:
// System.Net.HttpStatusCode.NotFound
Response.StatusCode = 404;
Response.StatusDescription = "Page not found";

你也可以很好地处理各种其他错误代码。

Google通常会关注302,然后尊重404状态代码 - 因此您需要确保在错误页面上返回该代码。

答案 1 :(得分:14)

您可以使用web.config将404错误发送到自定义页面。

    <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
    </customErrors>

答案 2 :(得分:3)

最简单的回答:不要在代码中执行,而是configure IIS instead

答案 3 :(得分:3)

我还面对302而不是404.我设法通过执行以下操作来修复它:

<强>控制器:

public ViewResult Display404NotFoundPage()
        {
            Response.StatusCode = 404;  // this line fixed it.

            return View();
        }

查看:

向用户显示一些错误消息。

<强>的web.config:

<customErrors mode="On"  redirectMode="ResponseRedirect">
      <error statusCode="404" redirect="~/404NotFound/" />
</customErrors>

最后,RouthConfig:

routes.MapRoute(
             name: "ErrorPage",
             url: "404NotFound/",
             defaults: new { controller = "Pages", action = "Display404NotFoundPage" }
         );

答案 4 :(得分:3)

我非常喜欢这种方法:它创建一个视图来处理所有错误类型并覆盖IIS。

[1]:删除所有&#39; customErrors&#39; &安培; &#39; httpErrors&#39;来自Web.config

[2]:检查&#39; App_Start / FilterConfig.cs&#39;看起来像这样:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

[3]:在Global.asax&#39;添加此方法:

public void Application_Error(Object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    var routeData = new RouteData();
    routeData.Values.Add("controller", "ErrorPage");
    routeData.Values.Add("action", "Error");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    Response.TrySkipIisCustomErrors = true;
    IController controller = new ErrorPageController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();
}

[4]:添加&#39; Controllers / ErrorPageController.cs&#39;

public class ErrorPageController : Controller
{
    public ActionResult Error(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        ViewBag.StatusCode = statusCode + " Error";
        return View();
    }
}

[5]:在#Views; Shared / Error.cshtml&#39;

@model System.Web.Mvc.HandleErrorInfo
@{
    ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
}

 <h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>


//@Model.ActionName
//@Model.ContollerName
//@Model.Exception.Message
//@Model.Exception.StackTrace

:d

答案 5 :(得分:2)

你在任何地方都使用它吗?

 Response.Status="404 Page Not Found"

答案 6 :(得分:2)

我可以看到在web.config中设置404页面是一个很好的干净方法,但它最初仍然会响应302重定向到错误页面。例如,如果您导航到:

https://stackoverflow.com/x.aspx

您将通过302重定向重定向到:

https://stackoverflow.com/404?aspxerrorpath=/x.aspx

我想要发生的是:

http://www.cnn.com/x.aspx

没有重定向。对丢失URL的请求将返回404状态代码,并带有友好的错误消息。

答案 7 :(得分:0)

您可以将IIS本身配置为返回特定页面以响应任何类型的http错误(包括404)。

答案 8 :(得分:0)

我认为最好的方法是在web.config中使用自定义错误构造,如下所示,这样就可以通过简单有效的方式连接页面来处理所有不同的HTTP代码。

  <customErrors mode="On" defaultRedirect="~/500.aspx">
     <error statusCode="404" redirect="~/404.aspx" />
     <error statusCode="500" redirect="~/500.aspx" />
  </customErrors>