我在哪里可以捕获404和500个错误?

时间:2018-03-23 17:28:07

标签: c# asp.net asp.net-mvc http-status-code-404 http-status-code-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中的方法。

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

尝试过的解决方案:

  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. 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.config中路由
    [Route("~/page_not_found")]
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;
        return View();
    }
    [Route("~/internal_server_error")]
    public ActionResult InternalServerError()
    {
        Response.StatusCode = 500;
        return View();
    }
    

1 个答案:

答案 0 :(得分:0)

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

相关问题