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?