使用MVC的异常管理应用程序块

时间:2012-06-08 17:15:55

标签: asp.net-mvc exception-handling application-blocks

我一直在扫描论坛,以便在ASP.NET MVC(MVC3)应用程序中实现异常管理应用程序块(EMAB)。

有很多关于ELMAH和NLog的讨论,以及通过global.asax(http://s151.codeinspot.com/q/694875)和一个ErrorController(http://www.davidjuth.com/asp-net-mvc-error-handler.aspx)方法进行处理以及利用[HandleError]装饰

我们正在考虑使用EMAB标准化我们的MVC应用程序的异常管理,但我似乎无法找到提供全面解决方案的任何具体示例。

是否有人有任何链接或能够准确解释如何在MVC框架内使用EMAB

1 个答案:

答案 0 :(得分:1)

我决定采用以下方法......

// * *在Global.asax

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception originalError = Server.GetLastError();
        Exception replacedError;

        if (ExceptionPolicy.HandleException(originalError, "Global Policy", out replacedError))
        {
            Exception ex = replacedError ?? originalError;
            if (ex.InnerException != null)
            {
                ex = ex.InnerException;
            }
            var httpException = ex as HttpException;
            HttpApplication httpApplication = this.Context.ApplicationInstance;

            string message = Utility.GetFullMessage(httpApplication, ex, "::");
            string messageHtml = Utility.GetFullMessage(httpApplication, ex, "<br/>");

            LogEntry logEntry = new LogEntry();
            logEntry.EventId = 100;
            logEntry.Priority = 2;
            logEntry.Message = ex.Message + "::" + message;
            Logger.Write(logEntry);

            Response.Clear();
            Server.ClearError();

            var routeData = new RouteData();
            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = Constants.ErrorGeneralKey; //"General"
            routeData.Values["message"] = ex.Message;
            routeData.Values["fullMessage"] = messageHtml;
            Response.StatusCode = 500;

            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();

                switch (Response.StatusCode)
                {
                    case 403:
                        routeData.Values["action"] = "Http403";
                        break;

                    case 404:
                        routeData.Values["action"] = "Http404";
                        break;

                    default:
                        routeData.Values["httpStatusCode"] = Response.StatusCode;
                        break;
                }
            }
            IController errorController = new ErrorController();
            var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
            errorController.Execute(rc);
        }
    }

// * *在助手类

    public static string GetFullMessage(HttpApplication httpApplication, Exception ex, string delimiter)
    {
        return "StackTrace: " + ex.StackTrace
                    + delimiter + "User: " + ((httpApplication.User == null) ? "<null>" : httpApplication.User.Identity.Name)
                    + delimiter + "Data: " + GetExceptionData(ex.Data)
                    + delimiter + "Version: " + httpApplication.Request.Browser.Version
                    + delimiter + "Browser: " + httpApplication.Request.Browser.Browser
                    + delimiter + "Major Version: " + httpApplication.Request.Browser.MajorVersion.ToString()
                    + delimiter + "Minor Version: " + httpApplication.Request.Browser.MinorVersion.ToString()
                    + delimiter + "Javascript Version: " + httpApplication.Request.Browser.JScriptVersion.ToString()
                    + delimiter + "Ecma Script Version: " + httpApplication.Request.Browser.EcmaScriptVersion.ToString()
                    + delimiter + "Platform: " + httpApplication.Request.Browser.Platform
                    + delimiter + "Source: " + ex.Source
                    + delimiter + "Form: " + httpApplication.Request.Form.ToString()
                    + delimiter + "QueryString: " + httpApplication.Request.QueryString.ToString()
                    + delimiter + "TargetSite: " + ex.TargetSite;
    }

// * *在错误控制器中

    public ActionResult General(string httpStatusCode, string message, string fullMessage)
    {
        errorViewModel.RootCause = Enums.RootCause.General;
        errorViewModel.HttpStatusCode = httpStatusCode;
        errorViewModel.Message = message;
        errorViewModel.FullMessage = fullMessage;
        return View("Error", errorViewModel);
    }

    public ActionResult Http404()
    {
        errorViewModel.RootCause = Enums.RootCause.NotFound;
        return View("Error", errorViewModel);
    }

    public ActionResult Http403()
    {
        errorViewModel.RootCause = Enums.RootCause.Forbidden;
        return View("Error", errorViewModel);
    }