2017-02-08 2 views
1

Ich habe ein Middleware-Element (CDASMiddleware) in Startup.cs hinzugefügt, das 4xx HTTP-Fehler identifiziert und eine Umleitung zu einem Fehlerhandler ausführt, der den Fehler in der Datenbank protokolliert und anzeigt eine benutzerdefinierte Fehlerseite.Redirect in Asp.Net Core-Middleware rendert Zielseite nicht

Nehmen wir zum Beispiel an, ich möchte 404 Fehler verfolgen. Die Invoke-Methode der Middleware behandelt diesen Fehler mit dem folgenden Code.

public async Task Invoke(HttpContext httpContext) 
{ 
    await _next(httpContext); 
    if (httpContext.Response.StatusCode == 404) 
    { 
     var message = [email protected]"404 error. URL: {httpContext.Request.Path.Value} was not found."; 
     Error e = new Error() { StatusCode = "404", Message = message }; 
     var obj = JsonConvert.SerializeObject(e); 
     httpContext.Session.SetString("HttpError", obj); 
     var url = httpContext.Request.PathBase + "/Error/HttpError"; 
     httpContext.Response.Redirect(url, true); 
    } 
} 

Und in der Tat, wenn dieser Code aufgerufen wird, wird die entsprechende Controller-Methode aufgerufen, die erfolgreich die Fehler in der Datenbank speichert und gibt dann die zugeordnete Ansicht.

public IActionResult HttpError() 
    { 
     var session = this.HttpContext.Session; 
     Error e = JsonConvert.DeserializeObject<Error>(session.GetString("HttpError")); 
     var el = GetErrorLogFromError(e); //create error log entry for db 
     _dataContext.ErrorLogDataSet.Upsert(el); 
     return View("~/Views/Shared/Error.cshtml", e); 
    } 

Nach einer F12 Debug im Browser zu tun, wie erwartet, sehe ich ein 302 (versucht hat, 301 als auch) im Zusammenhang mit der Umleitung und eine nachfolgenden 200-Antwort mit der korrekten HTML-Ansicht in dem http Körper. So erhält der Browser die richtige Ansicht. Aber es wird nicht gerendert und die Browser-URL ändert sich nicht, um die Umleitung wiederzugeben.

Oh, und die Methode Configure in Startup.cs ist

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ICDASDataContext dataContext) 
     { 
      app.UseSession(); 
      app.UseCDASMiddleware(); 
      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); //show detailed error page to developer 
       app.UseBrowserLink(); 
      } 
      else 
      { 
       app.UseExceptionHandler("/CDASUnhandledException"); //log to the database and show a custom error page to user for unhandled exceptions 
       Func<string, LogLevel, bool> f = ((s, logLevel) => logLevel >= LogLevel.Error); //log handled errors 
       loggerFactory.AddProvider(new CDASLoggerProvider(f, dataContext)); 
      } 
      app.UseStaticFiles(); 
      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "AreaRoute", 
        template: "{area:exists}/{controller}/{action}", 
        defaults: new { controller = "Home", action = "Index" }); 

       routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}/{id?}"); 


      }); 
     } 

Irgendwelche Ideen?

Antwort

0

Wenn der auslösende Aufruf ein JavaScript-Ajax-Aufruf ist, wie in diesem Head Scratcher, bewirkt die Umleitung in der Middleware, dass der Server die umgeleitete Seite erstellt und an den fehlgeschlagenen Rückruf des Ajax-Aufrufs zurückgibt. In diesem Rückruf kann ein document.write (data.responseText) zum Rendern der Fehlerseite verwendet werden.