我知道有几种方法可以捕获404和500错误。例如,我可以使用web.config,route.config,global.asax和控制器;但是,我不在哪里放置代码来捕获这些错误。让我告诉你我做了什么。
路线配置:
route.config适用于404错误,但它不适用于500个错误(据我所知)。无论如何,我不想使用它,因为我听说它有一些缺点。此外,对于这个问题,IMO似乎是一个非常糟糕的解决方案。
网络/网络配置:
我已经尝试了所有可能的Web配置文件:web.config(system.web和system.webServer)和Web.config(system.web和system.webServer)以及Web调试文件(system.web)和system.webServer)。所有这些都没有发现错误(它让我感到沮丧,因为没有人会告诉我在哪里完全放置代码所以它捕获。即,place1 - > place2 - > place3 - >等...每个答案给出我代码,并说Web.config或web.config - 我知道但在Web.config或web.config中的哪个?)我听说这种方式有限制,但它们与我无关。我知道它只适用于IIS 7+。我认为我的团队和我正在使用IIS 8,所以这对我来说应该不是问题。 我更喜欢global.asax或web.config / Web.config中的方法。
Global Asax:
我正在使用两个应用程序错误处理程序方法Application_EndRequest和Application_Error,这两个方法都不起作用。我得到的唯一错误是200错误(此错误仅由EndRequest捕获),这不是错误,而是恰恰相反。当我的页面显示404错误时,我不知道为什么我会这样做。据我所知,这是因为Global Asax没有编程来捕获这些错误,而是web.config和/或Web.config,如你所知,我不知道如何使这项工作。我会接受global.asax解决方案,因为我还没有听到任何不好的消息。
控制器:
我只尝试了一个解决方案:protected override void HandleUnknownAction(string actionName)
,解决方案在route.config {*url}
中调用了一个路由。令人惊讶的是,这也不起作用(如预期的那样)。我了解到这个解决方案使用代码{*url}
来查找404错误(或者至少它是我搜索过的解决方案。)正如我之前所说,我不想要一个route.config解决方案。如果我是正确的,protected override void HandleUnknownAction(string actionName)
可能在全球范围内有效,但不适用于我。
尝试过的解决方案:
protected override void HandleUnknownAction(string actionName)
protected void Application_EndRequest()
protected void Application_Error(object sender, EventArgs e)
protected override void OnException(ExceptionContext filterContext)
5
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="File" >
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="404"
path="404.html" />
<error statusCode="500"
path="500.html" />
</httpErrors>
</system.webServer>
6
<httpErrors>
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath=""
path="http://yoursite.com/index.asp?syserror" responseMode="Redirect" />
</httpErrors>
7
<customErrors mode="On">
<error statusCode="404" redirect="/Custom404.html" />
<error statusCode="500" redirect="/Custom500.html" />
</customErrors>
8
routes.MapRoute(
"Error", // Route name
"Error/{errorCode}", // URL with parameters
new { controller = "Page", action = "Error", errorCode= UrlParameter.Optional }
);
9
if (Context.Response.StatusCode == 404)
{
Response.Clear();
var rd = new RouteData();
rd.DataTokens["area"] = "AreaName"; // In case controller is in another area
rd.Values["controller"] = "Errors";
rd.Values["action"] = "NotFound";
IController c = new ErrorsController();
c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
}
10
Exception exception = Server.GetLastError();
// Log the exception.
ILogger logger = Container.Resolve<ILogger>();
logger.Error(exception);
Response.Clear();
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "Index");
}
else //It's an Http Exception, Let's handle it.
{
switch (httpException.GetHttpCode())
{
case 404:
// Page not found.
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// Server error.
routeData.Values.Add("action", "HttpError500");
break;
// Here you can handle Views to other error codes.
// I choose a General error template
default:
routeData.Values.Add("action", "General");
break;
}
}
注意:首先,我可能已经调整了一些解决方案以适应我的代码。其次,我不赞成这个解决方案。我在其他论坛页面上找到了大部分(如果不是全部)解决方案。第三,唯一有效的解决方案是第8个;但是,我相信它只适用于404s。不过,我不想使用它,因为我认为这是一个糟糕的解决方案(如果我错了,请纠正我。)
结论:
我不是要求你为我解决问题。我只需要两件事:一,如果我被误导(通过评论或回答),我需要纠正;两个,我需要知道WHERE来放置代码和代码的结果(通过图片或解释。)如果你输入如下内容:
这是适用于我的代码
[在此处插入代码]
[插入更多说明]
我很可能会复制代码,更改代码,尝试代码,如果/失败则不可避免地会感到不安。如果您可以花时间解释如何捕获404错误以及global.asax或Web / Web配置解决方案,我将非常感激。我已经在这个问题上苦苦挣扎了一段时间了,我已投入了大量的时间和精力,只是为了得到模糊的解决方案,几乎没有解释为什么它会捕获404/500错误或在哪里放错,确切地说。
修改
以下是我要点击的错误方法。我可以向您保证,他们使用routes.MapMvcAttributeRoutes();
[Route("~/page_not_found")]
public ActionResult PageNotFound()
{
Response.StatusCode = 404;
return View();
}
[Route("~/internal_server_error")]
public ActionResult InternalServerError()
{
Response.StatusCode = 500;
return View();
}
答案 0 :(得分:0)
我的经验是朝这个方向发展的。 在用户体验方面,做了500次重定向,让他看不到错误的页面。但是重定向 500 不会向重定向页面发送异常参数。 要使用 500 记录错误,必须使用 global.asax。