Actualmente tengo
app.UseExceptionHandler("/Home/Error");
Quiero hacer la ruta relativa a la ruta original.
Por ejemplo si
Tenant1 / PageThatThrowsError luego app.UseExceptionHandler ("Tenant1 / Home / Error");
pero si
Tenant2 / PageThatThrowsError luego app.UseExceptionHandler ("Tenant2 / Home / Error");
Pensé que podría hacer
app.UseExceptionHandler(
new ExceptionHandlerOptions
{
ExceptionHandler = async (ctx) =>
{
//logic that extracts tenant
ctx.Request.Path = new PathString(Invariant($"{tenant}/Home/Error"));
}
}
);
pero esto arroja un 500
EDITAR: todas las soluciones actuales que, por ejemplo, utilizan redireccionamientos pierden el contexto de error actual y no permiten que el controlador llame, por ejemplo, a HttpContext.Features.Get ().
Respuestas:
Suponemos que la aplicación ha requerido rutas y puntos finales de
/Tenant1/Home/Error
y/Tenant2/Home/Error
. Puede resolver el problema usando este código:Otra solución equivalente es poner el siguiente código en
startup.cs
:Suponemos que
tenant
proviene de algún lugar, como las aplicaciones. Luego, puede obtener fácilmente excepciones en su punto final deseado escribiendo una ruta simple en su acción:o puedes crear dos acciones diferentes:
Actualizar:
Si sus inquilinos se agregan dinámicamente y no se pueden poner en su
appsettings.json
(lo que supusimos en las soluciones anteriores), puede escribir un middleware para manejar las Excepciones, así es como:Agregue el middleware en su método
Startup.cs
inConfigure
:En la siguiente línea, agregue una ruta para errores (exactamente después del middleware):
Cree una clase para su middleware y ponga este código en:
Tenga en cuenta que se puede añadir todo lo que desea el contexto de esta manera:
context.Request.HttpContext.Features.Set<Exception>(ex);
.Y finalmente, debe crear una acción con una ruta adecuada para escribir su lógica allí:
Tenga en cuenta que el objeto que se estableció en el middleware, ahora se puede recuperar.
fuente
app.UseExceptionHandler($"/{tenant}/Home/Error");
no es estática! Puedes poner lo que quieras en lugar de{tenant}
, y con la rutaRoute("/{TenantId}/Home/Error")]
puedes escucharlos a todos.