проблема с Response.OutputStream.Write, добавляя html-код в полученный файл

Я читаю текстовый файл и пытаюсь отправить его в браузер, чтобы пользователю было предложено загрузить его, но я получаю свои данные и HTML-код внутри файла. Что я облажался? Спасибо.

byte[] eftTextFile = ...calls a method that returns a byte array (does a File.ReadAllBytes on a txt file)

Тогда я пробую:

Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", fileName));
Response.AddHeader("Content-Length", eftTextFile.Length.ToString());
Response.OutputStream.Write(eftTextFile, 0, eftTextFile.Length);
Response.Flush();

Это мой файл aspx.cs, полученный при нажатии кнопки. что просто:

<asp:Button ID="btnCreate" Text="Create" runat="server" OnClick="btnCreate_Click">

person user3242116    schedule 27.01.2014    source источник
comment
Лучше сделать обработчик и использовать обработчик для отправки файла. Возможно здесь какая-то часть вашей страницы уже отправлена ​​клиенту. Также после Response.Flush(); вы должны добавить Response.End();, чтобы прекратить отправку данных.   -  person Aristos    schedule 28.01.2014
comment
Фрагмент кода, который вы вставили. Из какого обработчика / метода события он вызывается? Page_Load? mybutton_Click? Page_Render? знание того, в какой момент жизненного цикла страницы она вызывается, поможет диагностировать проблему. Кроме того, есть ли на вашей странице какие-либо другие места, которые вы пишете непосредственно в ответ, или у вас есть настраиваемые элементы управления на вашей странице, которые могут это делать?   -  person eoldre    schedule 30.01.2014
comment
@Aristos +1 Спасибо, ваш вклад привел меня к решению связанной проблемы :), однако вместо добавления Response.End () после Response.Flush (): в зависимости от ваших требований (например, у меня) ... замените Response .Flush () с Response.End (), это не только отправляет весь буферизованный контент клиенту, но также останавливает выполнение страницы и вызывает EndRequestEvent, проверьте здесь   -  person EaziLuizi    schedule 26.08.2014


Ответы (5)


Просто напишите в конце

Response.End();
person ViPuL5    schedule 05.06.2014

Я пробовал использовать «HttpContext.Current.ApplicationInstance.CompleteRequest (); но это не сработало. Единственное, что я мог заставить работать, - это использовать Response.End (). Не уверен, почему один работает, а другой нет.

person user3242116    schedule 28.01.2014

Это может вас заинтересовать:

Большой двоичный файл поверх веб-службы asmx

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

person pid    schedule 27.01.2014

Вам необходимо позвонить на CompleteRequest () в конце.

Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"",    fileName));
Response.AddHeader("Content-Length", eftTextFile.Length.ToString());
Response.OutputStream.Write(eftTextFile, 0, eftTextFile.Length);
Response.Flush();
//now signal the httpapplication to stop processing the request.
HttpContext.Current.ApplicationInstance.CompleteRequest();

Вызов CompleteRequest превосходит вызов Response.End () тем, что он правильно отключает ответ и позволяет обойти некоторые проблемы в Internet Explorer, поднятые в этом вопросе:

IE 10 - проблемы с загрузкой файлов

person eoldre    schedule 27.01.2014
comment
Я пробовал использовать HttpContext.Current.ApplicationInstance.CompleteRequest (); но я получил тот же результат, мои данные txt с кодом html. Размер файла составляет всего 1 КБ, поэтому он небольшой. - person user3242116; 28.01.2014
comment
В другой раз у меня была аналогичная проблема, и оказалось, что мое антивирусное программное обеспечение (AVG) перехватывает HTTP-вызовы даже на локальный компьютер и вводит в него свой собственный код. Просто еще что-нибудь, чтобы попробовать отключить. - person eoldre; 28.01.2014

Ваша проблема может быть очень простой; у тебя есть это ...

attachment;filename

... где у вас должно быть (согласно спецификации) это:

attachment; filename

Обратите внимание на пробел.

person Steve Schneider    schedule 30.01.2014