2010-06-25 5 views
9

Ok, also bin ich auf dieses Problem ratlos. Ich habe eine Menge Dinge gesehen, die dieses Problem lösen sollen, aber ich bekomme keine Lösung, die meine Anforderungen erfüllen kann.Stop-Ausnahme von für nicht vorhandene Controller geworfen werden

Ich benutze ELMAH, um Ausnahmen zu protokollieren und erhalte diese Ausnahme, wenn entweder eine URL mit ungültigem Controller oder ordnungsgemäßer Controller und ungültige Aktion.

System.Web.HttpException: The controller for path '/BadController' was not found or does not implement IController. 
    at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) 
    at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 
    at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Ich möchte diese Ausnahme nicht ausgelöst werden. Ich verwende benutzerdefinierte Fehler und sie funktionieren gut, da die Anwendung an meine benutzerdefinierte 404-Fehlerseite sendet. Die Ausnahme wird jedoch weiterhin protokolliert.

Ich habe das Attribut [HandleError] schmücken alle Controller. Ist das möglich? Und wenn es so wäre, würde ich jede Hilfe schätzen.

Ich habe versucht, eine final route that redirects Einstellung, aber es ist eine Route vorher, aus welchem ​​Grund auch immer. Ich habe versucht, eine httpModule zu verwenden, und im Application_Error Ereignis der Global.asax Datei zu löschen. Nichts stoppt diese Ausnahmen.

Nochmals vielen Dank für jede Hilfe!

+0

Was ist daran schlimm, dass es geloggt wird? Reguläre 404 werden standardmäßig auch in Apache protokolliert. –

+0

Es ist nicht das Protokollieren so viel, aber die Ausnahme, die ich versuche zu zerquetschen. Ich möchte einen 404-Fehler, wie es ein 404 sein sollte. Aber meine ideale Situation, um die .NET-customErrors werfen eine 404 und keine Ausnahme geworfen werden. –

Antwort

1

War wahrscheinlich nicht mein Problem richtig weiterleiten, nachdem Tonnen von Graben um diese Ausnahme geworfen werden soll. Die Antwort ist, diese Ausnahmen von ELMAH gemäß dieser article auszuschließen.

Standardmäßig protokolliert ELMAH die Details jede nicht behandelte Ausnahme, einschließlich 404 und anderen HTTP-Fehler. Sie können ELMAH anweisen, diese oder andere Arten von Fehlern mit Fehler Filterung zu ignorieren.

+0

[Dieser Artikel] (http: //www.diaryofaninja.com/blog/2011/09/20/hinzufügen-filter-to-your-elmah-installation) hatte genau das, was ich gesucht habe, protokollieren sie den fehler aber mailen sie mir nicht, perfekt! –

2

Verbinden Sie eine benutzerdefinierte Controller-Factory, die die gewünschten Funktionen ausführen kann, wenn der angeforderte Controller nicht gefunden werden kann. Es sind nur ein paar Zeilen Code, nichts zu schmerzhaft.

Sie können Ihre eigene Controller-Factory rollen oder eine der vielen Bibliotheken als Ausgangspunkt verwenden. Sie haben eine Klasse, die IControllerFactory implementiert und innerhalb der CreateController() - Funktion wird Ihre benutzerdefinierte Logik sein.

0

Ich verwende DSO's ITCloud Contrib. Nichts davon {controller}/{action} generische Parameter. Explizite UrlRoute Attribute für jede Aktionsmethode. Ich sehe die Parameterabhängigkeiten direkt über der Methode.

4

Erstellen Sie eine RouteConstraint, die überprüft, ob der Controller existiert (tatsächlich scannt alle möglichen Controller am Anfang und zwischenspeichert es, wissen Sie, was ich meine) und fügen Sie es zu Ihrer Standardroute hinzu.

also, wenn Sie dann eine Anfrage an einen schlechten Controller haben, wird es von der normalen Route nicht akzeptiert. aber dann von der Catchall -> 404-Route akzeptiert ...

Verwandte Themen