我究竟在哪里捕获 404 和 500 错误?



我知道有几种方法可以捕获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中的方法。

全球阿萨克斯:

我正在使用两种应用程序错误处理程序方法 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)可能在全球范围内工作,但不适合我。

尝试的解决方案:

  1. protected override void HandleUnknownAction(string actionName)

  2. protected void Application_EndRequest()

  3. protected void Application_Error(object sender, EventArgs e)

  4. 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 个;但是,我相信它仅适用于 404。尽管如此,我不想使用它,因为我认为这是一个糟糕的解决方案(如果我错了,请纠正我。

结论:

我不是要你为我解决解决方案。我只需要两件事:第一,如果我被误导(通过评论或回答),我需要得到纠正;第二,我需要知道将代码和代码结果放在哪里(通过图片或解释)。如果您输入类似以下内容的内容:

这是对我有用的代码

[在此处插入代码]

[插入更多说明]

我很可能会复制代码,更改它,尝试它,如果/当它失败时,我不可避免地会感到不安。如果您能花时间解释如何捕获 404 错误以及 global.asax 或 web/Web 配置解决方案,我将不胜感激。我已经在这个问题上挣扎了一段时间,我投入了大量的时间和精力,只是得到了模糊的解决方案,几乎没有解释为什么它会捕获 404/500 错误或确切地放在哪里。

编辑:

这是我想命中的错误方法。我可以向你保证,它们是在我的route.config中使用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();
}

我的经验就是在这个方向上。 在用户体验方面,进行了500次重定向,以便他不会看到错误的页面。但是重定向 500 不会将异常参数发送到重定向的页面。 要使用 500 记录错误,必须使用 global.asax。

相关内容

最新更新