I думал было бы неплохо использовать CancellationToken
в моем контроллере следующим образом:
[HttpGet("things", Name = "GetSomething")]
public async Task<ActionResult> GetSomethingAsync(CancellationToken ct) {
var result = await someSvc.LoadSomethingAsync(ct);
return Ok(result);
}
Проблема в том, что теперь Azure Application Insights отображает кучу исключенийтипа System.Threading.Tasks.TaskCancelledException: A Task was canceled.
, а также случайные Npgsql.PostgresException: 57014: canceling statement due to user request
. Это шум, который мне не нужен.
Application Insights регистрируется как сервис с использованием стандартного метода - services.AddApplicationInsightsTelemetry(Configuration);
.
Попытка решения
Я думал, что смогувставьте в конвейер приложения и перехватите вышеуказанные исключения, преобразовав их в обычные ответы. Я поместил код ниже в разных местах. Он перехватывает любые исключения и, если IsCancellationRequested, возвращает фиктивный ответ. В противном случае он перебрасывает перехваченное исключение.
app.Use(async (ctx, next) =>
{
try { await next(); }
catch (Exception ex)
{
if (ctx.RequestAborted.IsCancellationRequested)
{
ctx.Response.StatusCode = StatusCodes.Status418ImATeapot;
}
else { throw; }
}
});
Этот код работает в том смысле, что он изменяет ответ. Однако исключения по-прежнему отправляются в Application Insights.
Требования
- Я хотел бы иметь решение, использующее
RequestAborted.IsCancellationRequested
вместо попытки отловить определенные исключения. Причина в том, что, если я уже обнаружил одну реализацию, которая выдает исключение, не полученное из OperationCanceledException
, существует вероятность, что есть другие, которые будут делать то же самое. - Не имеет значения, если ошибки зависимости все еще получаютне регистрируется, только то, что исключения, сгенерированные в результате отмены запроса, не выполняются.
- Я не хочу использовать try / catch в каждом методе контроллера. Его нужно разместить в одном месте.
Заключение
Хотелось бы, чтобы я понял механизм Application Insights, сообщающий об исключениях. После экспериментов я чувствую, что попытка отловить ошибки в конвейере приложений - неправильный подход. Я просто не знаю, что это такое.