Agarwal1984 Ответов: 2

Как устранить эту ошибку сервер не может добавить заголовок после отправки HTTP-заголовков.


Привет,

Как устранить эту ошибку "сервер не может добавить заголовок после отправки HTTP-заголовков".

Когда я запускаю вторую функцию для загрузки excel, она получает ошибку.

public void ExportQRCodeGenerateImageTableData(строковые данные)
{
string attach = "вложение;filename=QRGenerateImage.xls";
Ответ.ClearContent();
Ответ.AddHeader("content-disposition", attach);
Ответ.ContentType = "приложение/ms-excel";
Ответ.Запись данных);
Ответ.Промывать();
//Ответ.Конец();
}

public void ExportAllCustomerTableData(строковые данные)
{
string attach = "вложение;filename=CustomerDetails.xls";
Ответ.ClearContent();
Ответ.AddHeader("content-disposition", attach);// Ошибка:сервер не может добавить заголовок после отправки HTTP-заголовков.
Ответ.ContentType = "приложение/ms-excel";
Ответ.Запись данных);
//Ответ.Конец();
Ответ.Промывать();

}

Пожалуйста, помогите мне.

заранее спасибо

Анкит Агарвал
инженер-программист

2 Ответов

Рейтинг:
2

Ali Mosaad Mohamed

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

Решение

public ActionResult YouActionResultName()
        {
            Response.ClearHeaders();
            var gv = new GridView();
            gv.DataSource = db.Locations.ToList();
            gv.DataBind();
            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment; filename=LocationsWord.doc");
            Response.ContentType = "application/ms-doc";
            Response.Charset = "";
            StringWriter objStringWriter = new StringWriter();
            HtmlTextWriter objHtmlTextWriter = new HtmlTextWriter(objStringWriter);
            gv.RenderControl(objHtmlTextWriter);
            Response.Output.Write(objStringWriter.ToString());
            Response.Flush();
            Response.End();
            objStringWriter.Close();
            objHtmlTextWriter.Close();
            return Redirect("Index");
        }

Самое главное добавить
Response.ClearHeaders();
в начале действия результат.

После этого перейдите в индекс и поставьте этот код:

@using (Html.BeginForm("YouActionResultName", "YourControllerName", FormMethod.Post))
                {
                    <button class="btn btn-default" type="submit"> Excel <span class="glyphicon glyphicon-export"></span></button>
                }



Надеюсь, что это поможет, удачи вам всем.

С уважением,
Али Мохамед Мосаад,
разработчик


Richard Deeming

ОП использовал веб-формы. Ваше решение, по-видимому, представляет собой странную смесь элементов управления MVC и WebForms, а также использование более старого подхода WebForms к отправке файлов клиенту вместо правильного MVC FileResult подход.

Вы также отправляете заголовки, указывающие, что ответ является документом Word, даже если вопрос (и ваша ссылка) относятся к документу Excel.

И "HTML, но лгите об этом в заголовках" это не документ Word или файл Excel. Excel обычно делает все возможное, чтобы попытаться интерпретировать HTML, но он будет отображать предупреждение о том, что тип файла не соответствует содержимому.

Ali Mosaad Mohamed

Привет, Ричард Диминг, мы не воюем друг с другом, здесь мы делимся опытом в коде.

1 - Вы когда-нибудь читали вопрос о (Анкит Агарвал)? если вы прочтете, то поймете, почему я так сформулировал свой ответ.
2 - Вы можете добавить свой ответ, а не неуважение и сделать отрицательный комментарий.
3 - покажите нам свой опыт, в противном случае будьте осторожны, когда говорите о любом ответе, потому что это ответственно.

с наилучшими пожеланиями и пожеланиями,
Али Мохамед Мосаад
разработчик

Richard Deeming

Я читал этот вопрос - А вы? ОП использовал веб-формы. Ваш ответ - нет.

Я не склонен добавлять новые ответы к уже ответившим вопросам трехлетней давности. Это не проблема, если вы добавляете что-то новое в обсуждение. Но я не думаю, что ваше решение делает это.

Решение палаша правильное: проблема вызвана попыткой отправить новые заголовки после вызова Response.Flush. Добавление вызова в ResponseClearHeaders этого не исправишь.

Я не пытаюсь начать "войну", я просто предлагаю дружеский совет. :)

Рейтинг:
0

Palash Mondal_

Ну а проблема вот в чем Response.Flush() метод немедленно отправляет буферизованный вывод вместе с заголовком ответа и данными.

Следовательно, как только вы сделали Response.Flush() в вашей первой функции вы уже отправили данные заголовка.

Таким образом, либо у вас есть две кнопки для загрузки двух файлов отдельно, либо вы можете застегнуть их вместе, а затем пользователь может загрузить этот zip-файл и просмотреть оба файла.

Вы можете посмотреть эту реализацию здесь: Создание ZIP-файлов из ASP.NET применение[^]