У меня есть основное приложение 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?}");
});
}
Обновление 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
сможет справиться с этим, но ваше промежуточное ПО необходимо зарегистрировать после этого. - person Tseng   schedule 15.11.2016