У меня есть веб-сайт ASP .NET Core 3.1, который использует бритвенные страницы, но также имеет один контроллер, наследуемый от класса ASP .NET Core Controller. Контроллер обрабатывает полезную нагрузку, а затем в случае успеха перенаправляет на одну из бритвенных страниц. Я замечаю, что когда в контроллере есть необработанное исключение, браузер отображает ошибку HTTP 400 - недопустимый запрос, но я хочу, чтобы контроллер просто использовал обработчик исключений, который я уже определил, который выглядит следующим образом:
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Error");
В приведенном выше примере путь "/ Error" - это страница бритвы. В режиме без разработки контроллер не использует мой обработчик исключений и просто отображает ошибку браузера HTTP 400 - недопустимый запрос.
Мне удалось заставить его работать с классом фильтра исключений, где внутри метода OnException () я регистрирую ошибку и вручную перенаправляю на страницу «/ Error». Фильтр исключений выглядит так:
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();
});
}
Заранее спасибо!