Заголовки ответа не могут быть изменены, поскольку ответ уже запущен

#c# #asp.net-mvc #asp.net-core

#c# #asp.net-mvc #asp.net-core

Вопрос:

Я использую Asp.Net ядро 3.1

Я реализовал функциональность для загрузки файла Excel / CSV, записав данные в HttpContext Response, и я могу загрузить файл, но я получаю журнал ошибок с сообщением

 [ERR] An unhandled exception has occurred while executing the request. (48a46595)
System.InvalidOperationException: The response headers cannot be modified because the response has already started.  

Также я развернул свое приложение на сервере и получил код ошибки 502.

Ниже приведен код.

 public static class IWorkBookExtensions
    {
        public static void WriteExcelToResponse(this IWorkbook book, HttpContext httpContext, string templateName, ILogger<ExportDataController> _logger)
        {
            try
            {
                var response = httpContext.Response;
                response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                if (!string.IsNullOrEmpty(templateName))
                {
                    var contentDisposition = new Microsoft.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                    contentDisposition.SetHttpFileName(templateName);
                    response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();
                }
                book.Write(response.Body);
                
            }
            catch(Exception ex)
            {
                _logger.LogError(ex.InnerException.ToString()   ex.Message);
            }
           
        }
     }  

Ниже приведен журнал ошибок

 2020-10-13T14:45:17.1452752-05:00 80003b-00-fc00-3f-84967bb [ERR] An unhandled exception has occurred while executing the request. (48a46595)
System.InvalidOperationException: The response headers cannot be modified because the response has already started.
   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.ThrowIfReadOnly()
   at Microsoft.AspNetCore.HttpSys.Internal.HeaderCollection.set_Item(String key, StringValues value)
   at Microsoft.AspNetCore.Http.DefaultHttpResponse.set_ContentType(String value)
   --- End of stack trace from previous location where exception was thrown ---
   2020-10-13T14:45:17.1546662-05:00 80003b-00-fc00-3f-84967bb [WRN] The response has already started, the error page middleware will not be executed. (e1dd4c0d)
2020-10-13T14:45:17.2073595-05:00 880003b-00-fc00-3f-84967bb [ERR] Connection ID ""18300129210426"", Request ID ""80003b-00-fc00-3f-84967bb"": An unhandled exception was thrown by the application. (bf3147)
System.InvalidOperationException: The response headers cannot be modified because the response has already started.  

Комментарии:

1. Что такое IWorkbook. Что делать при записи?

2. Привет, @MikeJ, я использовал его для записи данных в файл Excel.

3. @MikeJ, я удалил IWorkbook. Напишите, и я все еще могу загрузить файл, но я не могу открыть файл Excel. Сообщение об ошибке «Excel не может открыть файл, поскольку формат или расширение файла недопустимы.

4. Извините, я недостаточно ясно выражаюсь. Это похоже на код внутри IWorkbook. Источником проблем может быть запись. Это то, что вы создали?

5. Это означает то, что он говорит. Если ответ уже отправлен пользователю, вы больше не можете изменять заголовки, они уже вышли. Можете ли вы показать код, который вы вызываете этот метод?