Atualmente tenho
app.UseExceptionHandler("/Home/Error");
Eu quero fazer o caminho em relação ao caminho original.
Por exemplo, se
Tenant1 / PageThatThrowsError e app.UseExceptionHandler ("Tenant1 / Home / Error");
mas se
Tenant2 / PageThatThrowsError e app.UseExceptionHandler ("Tenant2 / Home / Error");
Eu pensei que seria capaz de fazer
app.UseExceptionHandler(
new ExceptionHandlerOptions
{
ExceptionHandler = async (ctx) =>
{
//logic that extracts tenant
ctx.Request.Path = new PathString(Invariant($"{tenant}/Home/Error"));
}
}
);
mas isso gera um 500
EDIT: Todas as soluções atuais que, por exemplo, usam redirecionamentos, perdem o contexto de erro atual e não permitem que o controlador, por exemplo, chame HttpContext.Features.Get ().
Respostas:
Supomos que o aplicativo tenha exigido rotas e pontos finais de
/Tenant1/Home/Error
e/Tenant2/Home/Error
. Você pode resolver o problema usando este código:Outra solução equivalente é colocar o seguinte código no
startup.cs
:tenant
Supomos que isso venha de algum lugar como appsettings. Em seguida, é possível obter facilmente exceções no terminal desejado, escrevendo uma rota simples em sua ação:ou você pode criar duas ações diferentes:
Atualizar:
Se seus inquilinos são adicionados dinamicamente e não podem ser colocados no seu
appsettings.json
(o que supomos nas soluções acima), você pode escrever um middleware para lidar com as exceções, eis como:Adicione o middleware no seu método
Startup.cs
inConfigure
:Na próxima linha, adicione uma rota para erros (exatamente após o middleware):
Crie uma classe para o seu middleware e coloque estes códigos:
Note que você pode adicionar qualquer coisa que você quer para o contexto como este:
context.Request.HttpContext.Features.Set<Exception>(ex);
.E, finalmente, você deve criar uma ação com um roteamento apropriado para escrever sua lógica:
Observe que o objeto que foi definido no middleware agora pode ser recuperado.
fonte
app.UseExceptionHandler($"/{tenant}/Home/Error");
não é estática! Você pode colocar o que quiser em vez de{tenant}
, e com o caminho,Route("/{TenantId}/Home/Error")]
você pode ouvir todos eles.