Как вернуть 404 из промежуточного программного обеспечения исключения ASP.NET Core?

В моем приложении используется пользовательское исключение NotFoundException, и я использую промежуточное ПО обработчика исключений ядра ASP.NET для перехвата исключения и возврата ответа 404.

Это упрощенная версия промежуточного программного обеспечения.

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
      app.UseExceptionHandler(appBuilder => {
        appBuilder.Run(async context => {
          context.Response.StatusCode = (int)HttpStatusCode.NotFound;
          var responseContent = new {
            StatusCode = context.Response.StatusCode,
            Message = "Not found"
          };
          await context.Response.WriteAsJsonAsync(responseContent);
        });
      });
      ...
  }

Я ожидаю, что этот код вернет ответ 404 с содержимым в формате JSON, но запросы просто завершатся ошибкой. Если я запускаю тест с помощью HttpClient, я получаю следующую ошибку:

System.Net.Http.HttpRequestException: 'Error while copying content to a stream.'

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

// changing this line
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
// to this line will successfully return the result
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;

Этот код 404 работал, пока я не изменил целевую структуру с netcoreapp3.1 на net5.0. Что мне нужно изменить, чтобы успешно вернуть 404 с JSON из промежуточного программного обеспечения исключений при нацеливании на net5.0?


person Nick Prince    schedule 19.04.2021    source источник
comment
Вы видели AllowStatusCode404Response?   -  person Kirk Larkin    schedule 19.04.2021
comment
Я добавил services.AddExceptionHandler(options => options.AllowStatusCode404Response = true); и это не исправило. Однако ваш комментарий привел меня к тому, чтобы найти фактическое исправление.   -  person Nick Prince    schedule 20.04.2021


Ответы (1)


Похоже, проблема переходит от это обновление к ExceptionHandlerMiddleware.

Добавление этой строки исправило ответ, когда сайт работает в режиме реального времени.

await context.Response.CompleteAsync();

Однако эта строка не исправила мой тест с использованием TestServer, поскольку TestServer еще не реализует CompleteAsync .

person Nick Prince    schedule 19.04.2021