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

我试图确定在标准的ASP.NET Web应用程序中实现404页面的最佳方法。 我目前在Global.asax文件中的Application_Error事件中捕获404错误,并redirect到一个友好的404.aspx页面。 问题是请求看到一个302redirect后跟一个404页面丢失。 有没有办法绕过redirect和响应立即404包含友好的错误消息?

像Googlebot这样的networking爬虫如果对非现有页面的请求返回一个302,然后返回一个404,是否会关心?

在你的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 (null != serverError){ int errorCode = serverError.GetHttpCode(); if (404 == errorCode){ 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"; 

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

谷歌一般会遵循302,然后兑现404状态代码 – 所以你需要确保你在错误页面上返回。

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

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

最简单的答案:不要在代码中做,而是configurationIIS 。

你在哪里用这个?

  Response.Status="404 Page Not Found" 

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

https://stackoverflow.com/x.aspx

您将通过302redirectredirect到:

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

我想要发生的是这样的:

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

没有redirect。 对缺less的URL的请求会返回一个404状态代码,并显示友好的错误消息。

我也面临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" } ); 

我真的很喜欢这种方法:它创build一个单一的视图来处理所有错误types并覆盖IIS。

[1]:从Web.config中删除所有'customErrors'和'httpErrors'

[2]:检查“App_Start / FilterConfig.cs”如下所示:

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

[3]:在'Global.asax'中添加这个方法:

 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]:添加“控制器/ ErrorPageController.cs”

 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”

 @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

您可以configurationIIS本身以响应任何types的http错误(包括404)来返回特定页面。

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

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