Я пытаюсь настроить конвейер промежуточного программного обеспечения на использование двух разных обработчиков исключений для обработки одного и того же исключения. Например, я пытаюсь использовать мой собственный обработчик и встроенный DeveloperExceptionPageMiddleware следующим образом:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.ConfigureCustomExceptionHandler();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.ConfigureCustomExceptionHandler();
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvcWithDefaultRoute();
}
Моя цель состоит в том, чтобы пользовательский обработчик выполнял свои собственные функции (ведение журнала, телеметрия и т. Д.), А затем передавал (next ()) другому встроенному обработчику, который отображает страницу. Мой пользовательский обработчик выглядит так:
public static class ExceptionMiddlewareExtensions
{
public static void ConfigureCustomExceptionHandler(this IApplicationBuilder app)
{
app.UseExceptionHandler(appError =>
{
appError.Use(async (context, next) =>
{
var contextFeature = context.Features.Get<IExceptionHandlerFeature>();
if (contextFeature != null)
{
//log error / do custom stuff
await next();
}
});
});
}
}
Я не могу заставить CustomExceptionHandler передать обработку следующему промежуточному программному обеспечению. Вместо этого я получаю следующую страницу:
404 ошибка:
Я попытался переключить порядок, но затем появляется страница с описанием исключений разработчика и не вызывается обработчик пользовательских исключений.
Возможно ли вообще то, что я пытаюсь сделать?
Обновление:
Решением было взять исходное предложение Симонаре и повторно выдать исключение в методе Invoke
. Мне также пришлось удалить любой тип вмешательства, заменив следующий метод в HandleExceptionAsync
:
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
с:
return Task.CompletedTask;