Derzeit habe ich
app.UseExceptionHandler("/Home/Error");
Ich möchte den Pfad relativ zum ursprünglichen Pfad erstellen.
Zum Beispiel wenn
Tenant1 / PageThatThrowsError dann app.UseExceptionHandler ("Tenant1 / Home / Error");
doch wenn
Tenant2 / PageThatThrowsError dann app.UseExceptionHandler ("Tenant2 / Home / Error");
Ich dachte, ich könnte es tun
app.UseExceptionHandler(
new ExceptionHandlerOptions
{
ExceptionHandler = async (ctx) =>
{
//logic that extracts tenant
ctx.Request.Path = new PathString(Invariant($"{tenant}/Home/Error"));
}
}
);
aber das wirft eine 500
BEARBEITEN: Alle aktuellen Lösungen, die beispielsweise Weiterleitungen verwenden, verlieren den aktuellen Fehlerkontext und erlauben dem Controller nicht, beispielsweise HttpContext.Features.Get () aufzurufen.
Antworten:
Wir nehmen an, dass die Anwendung Routen und Endpunkte von
/Tenant1/Home/Error
und benötigt hat/Tenant2/Home/Error
. Sie können das Problem mit diesem Code lösen:Eine andere äquivalente Lösung besteht darin, den folgenden Code auf das zu setzen
startup.cs
:Wir nehmen an, dass
tenant
das von irgendwo wie Appsettings kommt. Dann können Sie leicht Ausnahmen für Ihren gewünschten Endpunkt erhalten, indem Sie eine einfache Route für Ihre Aktion schreiben:oder Sie können zwei verschiedene Aktionen erstellen:
Aktualisieren:
Wenn Ihre Mandanten dynamisch hinzugefügt werden und nicht in Ihre
appsettings.json
(was wir in den obigen Lösungen angenommen haben) eingefügt werden können , können Sie eine Middleware schreiben, um die Ausnahmen zu behandeln.Fügen Sie die Middleware zu Ihrer
Startup.cs
In-Configure
Methode hinzu:Fügen Sie in der nächsten Zeile eine Route für Fehler hinzu (genau nach der Middleware):
Erstellen Sie eine Klasse für Ihre Middleware und setzen Sie diesen Code auf:
Beachten Sie, dass Sie dem Kontext Folgendes hinzufügen können :
context.Request.HttpContext.Features.Set<Exception>(ex);
.Und schließlich sollten Sie eine Aktion mit einem geeigneten Routing erstellen, um Ihre Logik dort zu schreiben:
Beachten Sie, dass das Objekt, das in der Middleware festgelegt wurde, jetzt abgerufen werden kann.
quelle
app.UseExceptionHandler($"/{tenant}/Home/Error");
ist nicht statisch! Sie können setzen, was immer Sie wollen, anstatt{tenant}
, und mit der Route vonRoute("/{TenantId}/Home/Error")]
Ihnen können Sie alle von ihnen hören.