ASP.NET MVC HandleError

Wie gehe ich über den Filter [HandleError] in asp.net MVC Preview 5?
Ich habe die customErrors in meiner Datei Web.config festgelegt

     

und setze [HandleError] über meine Controller-class wie folgt:

 [HandleError] public class DSWebsiteController: Controller { [snip] public ActionResult CrashTest() { throw new Exception("Oh Noes!"); } } 

Dann lasse ich meine Controller von dieser class erben und CrashTest () für sie aufrufen. Visual Studio hält bei dem Fehler an und nachdem ich f5 gedrückt habe, um fortzufahren, werde ich auf Error.aspx umgeleitet? Aspxerrorpath = / sxi.mvc / CrashTest (wobei sxi der Name des verwendeten Controllers ist. Natürlich kann der Pfad nicht gefunden werden und ich bekomme “Servererrors in ‘/’ Anwendung.” 404.

Diese Seite wurde von Vorschau 3 zu 5 portiert. Alles läuft (war nicht so viel Arbeit zu portieren) außer der Fehlerbehandlung. Wenn ich ein komplettes neues Projekt erstelle, scheint die Fehlerbehandlung zu funktionieren.

Ideen?

–Hinweis–
Da diese Frage jetzt über 3K Aufrufe hat, dachte ich, es wäre von Vorteil, das, was ich gerade benutze (ASP.NET MVC 1.0) zu verwenden. Im mvc contrib-Projekt gibt es ein geniales Attribut namens “RescueAttribute”. Sie sollten es wahrscheinlich auch ausprobieren;)

 [HandleError] 

Wenn Sie Ihrer class (oder Ihrer Aktionsmethode) nur das HandleError-Attribut zur Verfügung stellen, sucht MVC nach einer unbehandelten Ausnahme zuerst im View-Ordner des Controllers nach einer entsprechenden View namens “Error”. Wenn es dort nicht gefunden werden kann, wird im Ordner “Gemeinsame Ansicht” gesucht (in dem standardmäßig die Datei “Error.aspx” enthalten sein sollte).

 [HandleError(ExceptionType = typeof(SqlException), View = "DatabaseError")] [HandleError(ExceptionType = typeof(NullReferenceException), View = "LameErrorHandling")] 

Sie können auch zusätzliche Attribute mit spezifischen Informationen über den Typ der Ausnahme, nach der Sie suchen, zusammenfassen. An diesem Punkt können Sie den Fehler auf eine andere Ansicht als die Standardansicht “Fehler” verweisen.

Weitere Informationen finden Sie in Scott Guthries Blog-Post darüber.

Es sollte auch beachtet werden, dass Fehler, die den HTTP-Fehlercode nicht auf 500 setzen

(zB UnauthorizedAccessException)

wird nicht vom HandleError-Filter behandelt.

Attribute in MVC ist sehr nützlich bei der Fehlerbehandlung bei get und post- Methode, es verfolgen auch für Ajax-Aufruf .

Erstellen Sie einen Basiscontroller in Ihrer Anwendung und erben Sie ihn in Ihrem Hauptcontroller (EmployeeController).

Öffentliche class EmployeeController: BaseController

Fügen Sie den folgenden Code in den Basiscontroller ein.

 ///  /// Base Controller ///  public class BaseController : Controller { protected override void OnException(ExceptionContext filterContext) { Exception ex = filterContext.Exception; //Save error log in file if (ConfigurationManager.AppSettings["SaveErrorLog"].ToString().Trim().ToUpper() == "TRUE") { SaveErrorLog(ex, filterContext); } // if the request is AJAX return JSON else view. if (IsAjax(filterContext)) { //Because its a exception raised after ajax invocation //Lets return Json filterContext.Result = new JsonResult() { Data = Convert.ToString(filterContext.Exception), JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else { filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.Result = new ViewResult() { //Error page to load ViewName = "Error", ViewData = new ViewDataDictionary() }; base.OnException(filterContext); } } ///  /// Determines whether the specified filter context is ajax. ///  /// The filter context. private bool IsAjax(ExceptionContext filterContext) { return filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest"; } ///  /// Saves the error log. ///  /// The ex. /// The filter context. void SaveErrorLog(Exception ex, ExceptionContext filterContext) { string logMessage = ex.ToString(); string logDirectory = Server.MapPath(Url.Content("~/ErrorLog/")); DateTime currentDateTime = DateTime.Now; string currentDateTimeString = currentDateTime.ToString(); CheckCreateLogDirectory(logDirectory); string logLine = BuildLogLine(currentDateTime, logMessage, filterContext); logDirectory = (logDirectory + "\\Log_" + LogFileName(DateTime.Now) + ".txt"); StreamWriter streamWriter = null; try { streamWriter = new StreamWriter(logDirectory, true); streamWriter.WriteLine(logLine); } catch { } finally { if (streamWriter != null) { streamWriter.Close(); } } } ///  /// Checks the create log directory. ///  /// The log path. bool CheckCreateLogDirectory(string logPath) { bool loggingDirectoryExists = false; DirectoryInfo directoryInfo = new DirectoryInfo(logPath); if (directoryInfo.Exists) { loggingDirectoryExists = true; } else { try { Directory.CreateDirectory(logPath); loggingDirectoryExists = true; } catch { } } return loggingDirectoryExists; } ///  /// Builds the log line. ///  /// The current date time. /// The log message. /// The filter context. string BuildLogLine(DateTime currentDateTime, string logMessage, ExceptionContext filterContext) { string controllerName = filterContext.RouteData.Values["Controller"].ToString(); string actionName = filterContext.RouteData.Values["Action"].ToString(); RouteValueDictionary paramList = ((System.Web.Routing.Route)(filterContext.RouteData.Route)).Defaults; if (paramList != null) { paramList.Remove("Controller"); paramList.Remove("Action"); } StringBuilder loglineStringBuilder = new StringBuilder(); loglineStringBuilder.Append("Log Time : "); loglineStringBuilder.Append(LogFileEntryDateTime(currentDateTime)); loglineStringBuilder.Append(System.Environment.NewLine); loglineStringBuilder.Append("Username : "); loglineStringBuilder.Append(Session["LogedInUserName"]); loglineStringBuilder.Append(System.Environment.NewLine); loglineStringBuilder.Append("ControllerName : "); loglineStringBuilder.Append(controllerName); loglineStringBuilder.Append(System.Environment.NewLine); loglineStringBuilder.Append("ActionName : "); loglineStringBuilder.Append(actionName); loglineStringBuilder.Append(System.Environment.NewLine); loglineStringBuilder.Append("----------------------------------------------------------------------------------------------------------"); loglineStringBuilder.Append(System.Environment.NewLine); loglineStringBuilder.Append(logMessage); loglineStringBuilder.Append(System.Environment.NewLine); loglineStringBuilder.Append("=========================================================================================================="); return loglineStringBuilder.ToString(); } ///  /// Logs the file entry date time. ///  /// The current date time. string LogFileEntryDateTime(DateTime currentDateTime) { return currentDateTime.ToString("dd-MMM-yyyy HH:mm:ss"); } ///  /// Logs the name of the file. ///  /// The current date time. string LogFileName(DateTime currentDateTime) { return currentDateTime.ToString("dd_MMM_yyyy"); } } 

===============================================

Sucht das Verzeichnis: Root / App_Start / FilterConfig.cs

Fügen Sie den folgenden Code hinzu:

 ///  /// Filter Config ///  public class FilterConfig { ///  /// Registers the global filters. ///  /// The filters. public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } } 

Verfolgen AJAX-Fehler:

Rufen Sie die CheckAJAXError-function beim Laden der Layoutseite auf.

 function CheckAJAXError() { $(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { var ex; if (String(thrownError).toUpperCase() == "LOGIN") { var url = '@Url.Action("Login", "Login")'; window.location = url; } else if (String(jqXHR.responseText).toUpperCase().indexOf("THE DELETE STATEMENT CONFLICTED WITH THE REFERENCE CONSTRAINT") >= 0) { toastr.error('ReferanceExistMessage'); } else if (String(thrownError).toUpperCase() == "INTERNAL SERVER ERROR") { ex = ajaxSettings.url; //var url = '@Url.Action("ErrorLog", "Home")?exurl=' + ex; var url = '@Url.Action("ErrorLog", "Home")'; window.location = url; } }); }; 

Lösung für HTTP-Fehlercode bis 500 Dies ist ein Attribut namens [FEHLER] setzen Sie es auf eine Aktion

 public class Error: System.Web.Mvc.HandleErrorAttribute { public override void OnException(System.Web.Mvc.ExceptionContext filterContext) { if (filterContext.HttpContext.IsCustomErrorEnabled) { filterContext.ExceptionHandled = true; } base.OnException(filterContext); //OVERRIDE THE 500 ERROR filterContext.HttpContext.Response.StatusCode = 200; } private static void RaiseErrorSignal(Exception e) { var context = HttpContext.Current; // using.Elmah.ErrorSignal.FromContext(context).Raise(e, context); } } 

//BEISPIEL:

 [Error] [HandleError] [PopulateSiteMap(SiteMapName="Mifel1", ViewDataKey="Mifel1")] public class ApplicationController : Controller { } 

Sie fehlen Error.aspx 🙂 In der Vorschau 5 befindet sich dies in Ihrem Views / Shared-Ordner. Kopieren Sie es einfach aus einem neuen Preview 5-Projekt.

  [HandleError] public class ErrorController : Controller { [AcceptVerbs(HttpVerbs.Get)] public ViewResult NotAuthorized() { //401 Response.StatusCode = (int)HttpStatusCode.Unauthorized; return View(); } [AcceptVerbs(HttpVerbs.Get)] public ViewResult Forbidden() { //403 Response.StatusCode = (int)HttpStatusCode.Forbidden; return View(); } [AcceptVerbs(HttpVerbs.Get)] public ViewResult NotFound() { //404 Response.StatusCode = (int)HttpStatusCode.NotFound; return View(); } public ViewResult ServerError() { //500 Response.StatusCode = (int)HttpStatusCode.NotFound; return View(); } 

}