在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
我想要发生的是这样的:
没有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>
- 为什么我在调用Response.Redirect()时得到“在发送HTTP头之后无法redirect”?
- 使用ASP.NETvalidation器进行datevalidation
- ASP.NET MVC 1.0 AfterBuilding视图在TFS Build上失败
- ASP.NET从Session中删除一个项目?
- 如何将一个RequiredFieldValidator添加到DropDownList控件?
- 您使用哪个.NET Memcached客户端,EnyimMemcached与BeITMemcached?
- 从stream中创buildZip文件并下载
- 回发或callback参数无效。 事件validation使用'<pages enableEventValidation =“true”/>'
- 在IIS7中托pipeASP.NET会导致Access被拒绝?