2016-04-13 4 views
7

Ich habe eine sehr einfache asp.net MVC 6 App mit grundlegenden Routing, und ich habe eine benutzerdefinierte ErrorController, um Fehler zu bestimmten Ansichten zu routen.MVC 6 keine Ausnahme für undefinierte Routen

Ich erwarte jedoch, dass, wenn der Benutzer eine URL eingibt, die nicht existiert, eine Ausnahme ausgelöst wird (und ich kann damit umgehen). Es wird jedoch keine Ausnahme ausgelöst, wenn ich eine zufällige URL eintippe, ich erhalte nur eine leere Seite. Ich bin mir ziemlich sicher, dass dies in MVC 6.

ähnlich funktioniert Die Fehlerbehandlung selbst funktioniert gut, wenn ich nur eine Ausnahme in einem Controller auslösen.

Startup.cs (teilweise)

public void Configure(IApplicationEnvironment appEnv, IApplicationBuilder app, IHostingEnvironment env) 
{ 
    if (env.IsDevelopment()) 
    { 
     app.UseBrowserLink(); 
     app.UseDeveloperExceptionPage(); 
    } 
    else 
    { 
     app.UseExceptionHandler(HandleException); 
    } 
    app.UseStaticFiles(); 
    app.UseMvc(routes => MapRoutes(routes, appEnv)); 
} 


private static void MapRoutes(IRouteBuilder routes, IApplicationEnvironment env) 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller}/{action}/{id?}", 
     defaults: new { controller = "main", action = "index" });   
} 

private static void HandleException(IApplicationBuilder errorApp) 
{ 
    #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously 
    errorApp.Run(async context => HandleErrorContext(context)); 
    #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously 
} 

private static void HandleErrorContext(HttpContext context) 
{ 
    var error = context.Features.Get<IExceptionHandlerFeature>(); 
    var exception = error.Error; 
    if (exception == null) 
    { 
     context.Response.Redirect("../error/external"); 
    } 
    else if (exception is ExpirationException) 
    { 
     context.Response.Redirect("../error/expired"); 
    } 
    else if (exception is HttpException) 
    { 
     var httpException = exception as HttpException; 
     int code = httpException.GetHttpCode(); 
     context.Response.Redirect("../error/external?code=" + code); 
    } 
    else 
    { 
     context.Response.Redirect("../error/external"); 
    } 
} 
+0

Nicht zu sehen, wo Sie benutzerdefinierte 'ErrorController' in der Pipeline enthalten. Fehle ich etwas in deinem Code? – Nkosi

+0

Ich habe eine andere Methode (unter was ich eingefügt habe), die das behandelt, was gut funktioniert, wenn ich eine Ausnahme manuell auslösen. Das Problem ist, dass überhaupt keine Ausnahme ausgelöst wird, so dass es nie zu diesem Punkt kommt. – user2713516

Antwort

1

keine direkte Antwort auf meine Frage, aber ich habe die Abhilfe von https://stackoverflow.com/a/4833519/2713516 Arbeits bekommt. Ich wundere mich immer noch, warum asp.net keine 404 obwohl wirft.

  routes.MapRoute(
       "PageNotFound", 
       "{*catchall}", 
       new { controller = "Home", action = "PageNotFound" } 
       ); 
+0

So mache ich es eigentlich. Ich leite es auf meine Fehler-Controller nicht gefunden Aktion, wo ich protokollieren und meine benutzerdefinierte Ansicht anzeigen. – Nkosi

1

Sie können durch Hinzufügen des StatusCodePages benutzerfreundliche Fehlerseiten zeigen Middleware auf den pipeine. In Startup.cs

public void Configure(IApplicationEnvironment appEnv, IApplicationBuilder app, IHostingEnvironment env) 
{ 
    if (env.IsDevelopment()) 
    { 
     app.UseBrowserLink(); 
     app.UseDeveloperExceptionPage(); 
    } 
    else 
    { 
     app.UseExceptionHandler("/error/500"); 
     app.UseStatusCodePagesWithReExecute("/error/{0}"); 
    } 
    app.UseStaticFiles(); 
    app.UseMvc(routes => MapRoutes(routes, appEnv)); 
} 

Antworttext sollte /error/{0} durch erneutes Ausführen des Pfades erzeugt werden.

[Route("[controller]")] 
public class ErrorController : Controller 
{    
    [HttpGet("{statusCode}")] 
    public IActionResult Error(int statusCode) 
    {  
      //switch (statusCode) 
      //{ 
      // return different views... 
      //} 

      Response.StatusCode = statusCode; 
      return View("Error", statusCode); 
    } 
} 

So können Sie eine 404-Fehlerseite oder eine andere Fehlerseite anzeigen.

+0

Danke für den Kommentar, aber ich habe bereits diese Lösung an Ort und Stelle, das Problem ist, dass keine Ausnahme jemals geworfen wird, so dass es nie meine 'Handle Exception' -Methode – user2713516

+0

@ user2713516 können Sie diese Methode zeigen? – tmg

+0

Ich habe es zu der Frage – user2713516