У меня есть приложение asp.net core. Реализация метода configure перенаправляет пользователя на страницу «Ошибка» при возникновении исключения (в среде без разработки)Обработка исключения в ядре asp.net?
Однако он работает только в том случае, если исключение происходит внутри контроллера. Если исключение происходит вне контроллера, например, в моем настраиваемом промежуточном программном обеспечении, пользователь не перенаправляется на страницу с ошибкой.
Как перенаправить пользователя на страницу «Ошибка», если в промежуточном программном обеспечении есть исключение.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseSession();
app.UseMyMiddleware();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Update 1
Я обновил код выше со следующими двумя линиями, которые отсутствовали в первоначальном сообщении.
app.UseSession();
app.UseMyMiddleware();
Также я обнаружил, почему app.UseExceptionHandler
не удалось перенаправить на страницу ошибки.
Когда в моем промежуточном коде есть исключение, app.UseExceptionHandler("\Home\Error")
перенаправляет на \Home\Error
, как и ожидалось; но поскольку это новый запрос, мое промежуточное программное обеспечение снова выполнялось и снова выбрасывало исключение.
Итак, чтобы решить этот вопрос я изменил свое промежуточное программное обеспечение для выполнения только if context.Request.Path != "/Home/Error"
Я не уверен, что это правильный способ, чтобы решить эту проблему, но ее работу.
public class MyMiddleWare
{
private readonly RequestDelegate _next;
private readonly IDomainService _domainService;
public MyMiddleWare(RequestDelegate next, IDomainService domain)
{
_next = next;
_domainService = domain;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path != "/Home/Error")
{
if (context.User.Identity.IsAuthenticated && !context.Session.HasKey(SessionKeys.USERINFO))
{
// this method may throw exception if domain service is down
var userInfo = await _domainService.GetUserInformation(context.User.Name).ConfigureAwait(false);
context.Session.SetUserInfo(userInfo);
}
}
await _next(context);
}
}
public static class MyMiddleWareExtensions
{
public static IApplicationBuilder UseMyMiddleWare(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyMiddleWare>();
}
}
Где находится пример вашего пользовательского промежуточного программного обеспечения? Я думаю, ** 'UseExeptionHandler' должен иметь возможность справиться с этим, но ваше промежуточное программное обеспечение должно быть зарегистрировано ** после ** этого. – Tseng