Wie kann ich dies in den neuen ASP.NET MVC 6-Anwendungen erreichen? Kann ich dies mithilfe der integrierten UseErrorHandler-Methode tun?
Schnell Antwort: Nicht in einer eleganten Art und Weise.
Erklärung/Alternative: Um lässt auf den ersten Blick zu starten, was die UseErrorHandler
Methode tatsächlich tut: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerExtensions.cs#L25, die folgende Middleware ergänzt: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.csHinweis Zeilen 29-78 (die Methode invoke)
Die invoke Die Methode wird ausgeführt, sobald eine Anfrage eingeht (gesteuert durch den Standort Ihrer application.UseErrorHandler("...")
in Ihrer Startup.cs
). So ist die UseErrorHandler
eine bessere Möglichkeit, eine benutzerdefinierte Middleware hinzuzufügen: Middleware = Komponente, die auf eine http-Anfrage einwirken kann.
Jetzt mit diesem Hintergrund, wenn wir unsere eigene Fehler-Middleware hinzufügen wollten, differenzierte Anfragen. Wir könnten dies tun, indem wir eine ähnliche Middleware hinzufügen, die wie der Standard ErrorHandlerMiddleware
ist, indem wir diese Zeilen ändern: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.cs#L48-L51 Mit diesem Ansatz könnten wir den Umleitungsweg basierend auf dem Statuscode steuern.
In MVC 5 haben wir den system.web custom Abschnitt für ASP.NET und den system.webServer httperrors Abschnitt in der Datei web.config verwenden mussten, aber es war schwierig, mit einer unhandlich zu arbeiten, mit vielen sehr seltsames Verhalten. Macht MVC 6 das viel einfacher?
Antwort: Es ist sicher :). Genau wie die obige Antwort liegt das Problem darin, Middleware hinzuzufügen.Es gibt eine Verknüpfung zum Hinzufügen einfacher Middleware über die IApplicationBuilder
in Ihrem Startup.cs
; am Ende Ihrer Configure
Methode können Sie fügen Sie folgendes:
app.Run(async (context) =>
{
await context.Response.WriteAsync("Could not handle the request.");
// Nothing else will run after this middleware.
});
Dies funktioniert, weil es bedeutet, dass Sie das Ende Ihrer http Pipeline ohne die Anfrage bearbeitet wird erreicht (da es am Ende Ihrer Configure
Methode ist in Startup.cs
). Wenn Sie diese Middleware hinzufügen möchten (in der schnellen Mode) mit der Option, Middleware, nachdem Sie auszuführen, gehen Sie wie folgt:
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Could not handle the request.");
// This ensures that any other middelware added after you runs.
await next();
});
hoffe, das hilft!
Hinweis: Dies ist eine bessere Lösung als die unten angegebene. –
Dieser Code wird für alle Anfragen ausgeführt. Habe ich recht, wenn ich sage, dass dies dem Action-Delegaten hinzugefügt wird, der an UseErrorHandler übergeben werden kann? –
@RehanSaeed: Ja, dies könnte für alle Anfragen ausgeführt werden, da es die Antworten abfangen muss, um den Statuscode zu überprüfen. Ihre zweite Frage ist mir nicht klar. Dies ist eine andere Middleware als der 'UserErrorHandler'. Kannst du mehr ausarbeiten? –