【问题标题】:Where EXACTLY Do I Catch 404 And 500 Errors?我究竟在哪里捕获 404 和 500 错误?
【发布时间】:2018-09-02 11:11:12
【问题描述】:

我知道有几种方法可以捕获 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 中的 WHERE?)我听说这种方式有限制,但它们与我无关。我知道它只适用于 IIS 7+。我认为我的团队和我正在使用 IIS 8,所以这对我来说应该不是问题。 我更喜欢 global.asax 或 web.config/Web.config 中的方法。

全球 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) 可能在全球范围内工作,但不适用于我。

尝试过的解决方案:

  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();
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc http-status-code-404 http-status-code-500


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 2013-08-20
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2013-12-16
      • 2012-06-29
      • 2017-08-14
      • 1970-01-01
      相关资源
      最近更新 更多