0

我一直在浏览论坛以查找 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

4

1 回答 1

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);
    }
于 2012-10-03T22:10:31.877 回答