2012-06-08 2 views
0

J'ai analysé les forums pour une implémentation du bloc EMAB (Exception Management Application Block) dans une application ASP.NET MVC (MVC3).Bloc d'application de gestion des exceptions avec MVC

Il y a beaucoup de discussions sur ELMAH et NLog ainsi que la manipulation par l'approche global.asax (http://s151.codeinspot.com/q/694875) Vs un ErrorController (http://www.davidjuth.com/asp-net-mvc-error-handler.aspx), ainsi que tirer parti de la [HandleError] décoration

Nous cherchons à normaliser notre gestion des exceptions de nos applications MVC avec EMAB mais je n'arrive pas à trouver des exemples spécifiques qui fournissent une solution complète.

Quelqu'un at-il des liens ou peut expliquer exactement comment vous pourriez utiliser EMAB dans le cadre MVC

Répondre

1

j'ai décidé l'approche ci-dessous ...

// * * Dans 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); 
     } 
    } 

// * * en classe d'aide

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

// * * Dans le contrôleur d'erreur

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); 
    } 
Questions connexes