У меня есть ASP. NET Веб-сайт Core 3.1, который использует бритвенные страницы, но также имеет один контроллер, который наследуется от ASP. NET Класс Core Controller. Контроллер обрабатывает полезную нагрузку и затем перенаправляет на одну из бритвенных страниц в случае успеха. Я замечаю, что когда в контроллере есть необработанное исключение, браузер отображает HTTP 400 - ошибка неверного запроса, но я хочу, чтобы контроллер просто использовал обработчик исключений, который я уже определил, и выглядит так:
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Error");
В приведенном выше пути "/ Ошибка" - это страница бритвы. В режиме без разработки контроллер не использует мой обработчик исключений и просто отображает HTTP 400 - ошибка браузера Bad Request.
Мне удалось заставить его работать с классом фильтра исключений, где внутри метода OnException () я зарегистрировать ошибку и вручную перенаправить на страницу «/ Ошибка». Фильтр исключений выглядит следующим образом:
private class CustomExceptionFilter : IExceptionFilter
{
private readonly IWebHostEnvironment hostingEnvironment;
private readonly ILogger<CustomExceptionFilter> logger;
public CustomExceptionFilter(IWebHostEnvironment hostingEnvironment, ILogger<CustomExceptionFilter> logger)
{
this.hostingEnvironment = hostingEnvironment;
this.logger = logger;
}
public void OnException(ExceptionContext context)
{
if (this.hostingEnvironment.IsDevelopment())
{
return;
}
this.logger.LogError(context.Exception, string.Empty);
context.Result = new RedirectToPageResult("/Error");
}
Затем я определил [TypeFilter (typeof (CustomExceptionFilter)))] на самом контроллере. Кажется, все работает, но кажется, что движущихся частей много. Это единственный способ сделать это или, может быть, я что-то упускаю?
Вот код запуска:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseForwardedHeaders();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts(options => options.MaxAge(365).IncludeSubdomains());
}
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseXRobotsTag(options => options.NoIndex().NoFollow());
app.UseXfo(options => options.SameOrigin());
app.UseXXssProtection(options => options.EnabledWithBlockMode());
app.UseXContentTypeOptions();
app.UseNoCacheHttpHeaders();
app.UseRedirectValidation();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapRazorPages();
});
}
Заранее спасибо!