Archiv der Kategorie: Fehler

ASP.NET MVC Custom Error Handler Attribute und Ajax Calls


Normalerweise, fange ich die meisten Fehler direkt im Code ab und habe in jedem Ajax Request ein erweitertes Response Model was immer von einer Basisklasse ableitet in dem ich Nachrichten oder Fehlermeldungen mit übergeben kann.

Sobald also bei einem Response Meldungen enthalten sind, dann werden diese z.B. von AngularJs per Interceptor ausgewertet und im UI angezeigt. Das klappt auch sehr gut so lange man ein “aufgeblähtes” Model zurückgeben möchte. Wenn ich aber nur Daten für ein Typeahead benötige, was nur eine List<string> zurückgeben soll, dann möchte ich hier nicht eine Extra Klasse anlegen die nur ein Property für die List<string> enthält, nur damit ich eine Fehlermeldung mit zurückgeben kann. Für diese Fälle habe ich jetzt den Custom Error Handler für mich entdeckt.

Der Custom Error Handler wird aufgerufen, sobald eine Exception auftritt die nicht abgefangen wird und bis zum Controller Aufruf durchgereicht wird. Hier wird die Exception dann abgefangen und man kann den Ajax Call entsprechend ändern der zurückgegeben werden soll und den Fehler zurückgeben z.B. in der von mir bevorzugten Struktur, damit der Interceptor den Fehler auch abfangen und anzeigen kann.

Code Custom Error Handler:

/// <summary>
/// Custom Error Handler der über der passenden Controller Funktion verwendet wird um unbehandelte Ausnahmen abzufangen.
/// </summary>
public class CustomErrorHandlerAttribute : HandleErrorAttribute
{
    public bool IsAjaxCall { get; set; }

    public override void OnException(ExceptionContext context)
    {
        if (IsAjaxCall)
        {
            context.ExceptionHandled = true;
            var jsonResult = new JsonResult();
            jsonResult.Data = new {Message = context.Exception.Message , MessageType = "Error"};
            jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            jsonResult.ExecuteResult(context);
        }
        else
        {
            // if not an ajax request, continue with logic implemented by MVC -&gt; html error page
            base.OnException(context);
        }
    }
}

Beispiel Controller Methode die einen Fehler verursacht:

[CustomErrorHandler(IsAjaxCall = true)]
public JsonResult AddJsEntryOnly(Person person)
{
    throw  new Exception("Beim Laden der Daten ist ein Fehler aufgetreten!");
    return Json(person, JsonRequestBehavior.AllowGet);
}

Wenn ich den Rückgabewert (Ajax Call)  jetzt im Browser in der Konsole ausgeben lasse steht da:

image

Advertisements

Deploymentfehler – allowDefinition= ‚MachineToApplication‘


Beim Automatischen Veröffentlichen (Publish) meines MVC Projektes bekam ich folgenden Fehler:

““Einen Abschnitt, der als allowDefinition=’MachineToApplication‘ registriert ist, über die Programmebene hinaus zu verwenden verursacht einen Fehler. Dieser Fehler kann von einem virtuellen Verzeichnis verursacht werden, das nicht als Anwendung in IIS konfiguriert ist.”

Dieser lies sich leicht beheben nach dem ich folgenden Eintrag aus meiner *.csproj Datei des Webprojektes entfernt habe:

“<MvcBuildViews>true</MvcBuildViews>”

Diesen Eintrag hatte ich meinem MVC Projekt selbst hinzugefügt um auch die MVC Views direkt beim Erstellen auf Fehler zu prüfen, siehe Blogeintrag.

Nach einem guten Hinweis von B. ABT habe ich noch einmal etwas Recherchiert und natürlich gibt es mehrere Möglichkeiten, das Problem zu beseitigen. Denn das Attribut “MvcBuildViews” ist beim Compilieren von MVC Projekten mehr als nur hilfreich.

Die zweite Möglichkeit die Fehlermeldung beim Publish und Build zu entfernen, wäre einfach ein Pre-build Event in eurem Webprojekt anzulegen, welches den Ordner “obj” vor jedem Erstellen entfernt.

Dazu einfach folgende Zeile im Pre-build eures Webprojektes einfügen:

rd  /S /Q „$(ProjectDir)\obj“

B. ABT hat mich zwar auch noch auf folgendes Tool hingewiesen: http://wf.codeplex.com/SourceControl/latest dies schien mir aber doch etwas “riskant” und evtl. überdimensioniert für mein Problem. Ist aber ein Cooles Tool wenn man mal schnell nur den Source Code und Projektdateien aus einem Projekt benötigt ohne TFS, Resharper Dateien, ….