处理的Global.asax内所有异常(Handling all exceptions within

2019-09-17 04:34发布

我想处理的Global.asax内的所有应用程序异常为MVC 3项目,而一切都正确内卡西尼当我部署到IIS 7.5工作,IIS开始采取控制从我的应用程序,距离处理许多例外本身。 这有绕过我的自定义日志记录,并返回丑意见的后果。

我有一个类似的方法来Darin的回答到这个问题 。 下面是我使用的时刻是什么。

protected void Application_Error(object sender, EventArgs e)
{
    var app = (MvcApplication)sender;
    var context = app.Context;
    var exception = app.Server.GetLastError();

    LogExceptionDetails(exception, Request.Url.PathAndQuery);

    context.Response.Clear();
    context.ClearError();

    string redirectTo = "/error";
    HttpException httpException = exception as HttpException;

    if (httpException != null)
    {
        switch (httpException.GetHttpCode())
        {
            case 403:
                redirectTo += "/forbidden";
                break;
            case 404:
                redirectTo += "/notfound";
                break;
        }
    }

    Response.TrySkipIisCustomErrors = true;

    // I should really change this so I can return a proper statusCode
    Response.Redirect(redirectTo);
}

作为一个实例,导航到localhost/app_code将返回一个难看视图和将不被记录。 我已成功地至少使IIS使用回到我的自定义视图:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="403" />
    <error statusCode="403" path="/error/forbidden" responseMode="ExecuteURL" />
    <remove statusCode="404" />
    <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
</httpErrors>

这可能没有什么解决日志问题。

我试过其他的事情包括:

  1. 设置existingResponse="PassThrough"
  2. 使用<clear />
  3. 的各种组合httpErrors有和无customErrors
  4. 设置<modules runAllManagedModulesForAllRequests="true" />
  5. Response.TrySkipIisCustomErrors = true;

有没有一种方法以编程方式处理这个问题,同时保持东西Global.asax的集中,而不是在web.config乱搞?

Answer 1:

是。 下面是我在做什么,但遗憾的是并不完美。

首先,关闭自定义错误。

<customErrors mode="Off" />

接下来,更改HttpErrors为详细。 请注意,这是我特别不喜欢,主要是因为如果你这样做,似乎你可能让你的堆栈跟踪访问的一部分。 我认为,只要你在处理你的错误处理的所有状态代码,通过包罗万象的,你应该确定。 如果我错了请纠正我。

<httpErrors errorMode="Detailed" />

您还需要一个catch all route在您的Global.asax赶不符合您定义的路由的所有MVC的路线,并将它们发送到您的404这可能是有问题的根据您的路线设置,主要是,如果你依赖在包罗万象的途径来处理当前的非404路线。 我使用反射来定义所有基于我的控制器操作方法我的路线,所以不依赖于捕捉我的应用程序的所有航线格局。

最后,处理您Global.asax中的错误。 使用包罗万象的(如500),以及你想要不同的东西,比如404错误做特殊路由。

protected void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError().GetBaseException();

    Server.ClearError();

    var routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "500");

    if (ex.GetType() == typeof (HttpException))
    {
        var httpException = (HttpException) ex;
        var code = httpException.GetHttpCode();

        // Is it a 4xx Error
        if (code % 400 < 100)
        {
            routeData.Values["action"] = "404";
        }
    }

    IController errorController = new ErrorController();
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}

请注意,在我的例子中,我把除了4XX错误,500也都错误,在这个例子中我使用了一个名为“ErrorController”控制器,并命名为“500”和“404”两个动作。

我希望这会有所帮助,如果你找到一个解决办法向HttpErrors需要被设置为“详细”,请你分享!



文章来源: Handling all exceptions within global.asax