Промежуточное программное обеспечение ExceptionHandler Web API Core 3.1 «не может записать в закрытый поток» во время записи в HttpContext.Response - PullRequest
1 голос
/ 24 февраля 2020

У меня есть простой Web API Core v3.1, где я пытаюсь обрабатывать исключения глобально. После этого ответа { ссылка } вот мой код для этого.

 app.UseExceptionHandler(appBuilder => appBuilder.Run(async context =>
 {
     var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
     var exception = exceptionHandlerPathFeature.Error;

     var result = JsonConvert.SerializeObject(new { error = exception.Message });
     context.Response.ContentType = "application/json";
     await context.Response.WriteAsync(result);
 }));

Я получаю ошибку на context.Response.WriteAsync(result);:

System.ObjectDisposedException: Невозможно получить доступ к закрытому потоку.

Я почти уверен, что мне чего-то не хватает по основам c, но я не могу понять это.

Мне по сути нужно обернуть ответ на объект всякий раз, когда возникает исключение.

1 Ответ

1 голос
/ 24 февраля 2020

Похоже, что кто-то другой (другой посредник) уже закрыл поток.

In. net - ядро ​​имеет значение. Помните в ссылке, которой вы поделились:

Важно: Не забудьте добавить ее перед использованием Mvc (или UseRouting in. Net Core 3), так как важен порядок.

Итак, объявите UseExceptionHandler перед любым другим Middlewhate и / или объявлением конфигурации.

Ознакомьтесь с руководством по промежуточному программному обеспечению здесь

Объедините несколько делегатов запросов вместе с использованием. Следующий параметр представляет следующий делегат в конвейере. Вы можете закоротить конвейер, не вызывая следующий параметр. Обычно вы можете выполнять действия как до, так и после следующего делегата, как показано в следующем примере:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            // Do work that doesn't write to the Response.
            await next.Invoke();
            // Do logging or other work that doesn't write to the Response.
        });

        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello from 2nd delegate.");
        });

UseExceptionHandler - первый компонент промежуточного программного обеспечения, добавленный в конвейер , Поэтому промежуточное программное обеспечение обработчика исключений перехватывает любые исключения, возникающие в последующих вызовах.

При первом запуске завершается конвейер. Таким образом, вы можете выполнить некоторую работу, но в конце, когда произойдет первый запуск, отклик закроется.

Пожалуйста, поделитесь с нами большим количеством кода, чтобы помочь больше.

...