Накачка байтов непосредственно в Response.OutputStream - как бороться с количеством байтов? - PullRequest
3 голосов
/ 01 июля 2011

У меня есть необходимость передавать большие потоки данных из веб-службы. Вместо того, чтобы увеличивать размер буфера IIS в метабазе, я хотел бы закачать байты непосредственно в небуферизованный Response.OutputStream.

Response.ClearHeaders();
Response.Clear();
Response.ContentType = "text/xml";
Response.Buffer = false;
int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream);
Response.End();

Это работает нормально, но я могу знать только, сколько байт было извлечено после их получения, поэтому я не могу установить заголовок ContentLength. Следующая строка выдает исключение (невозможно добавить заголовки после начала возврата содержимого):

int len = GetReport(protocolName, sourceName, reportName, pageIndex, pageSize, Response.OutputStream);
Response.AddHeader("Content-Length", len.ToString()); // can't do this

Вопрос: Полагаю, вариантов на самом деле не так много. Я предполагаю, что единственный способ справиться с этим - ввести промежуточный поток, например, поток памяти, получить длину потока, установить заголовок, а затем накачать этот поток в поток Response.Output. Есть другие идеи? '

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

content-length не требуется.Если вы на законных основаниях не знаете об этом до отправки контента в поток ответов, то оставьте его.Браузер все равно будет отображать результат в порядке, но не сможет обеспечить индикатор выполнения или процент выполнения.Если содержимое невелико, это не является серьезной проблемой.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13

В HTTP его СЛЕДУЕТ отправлять всякий раз, когда длина сообщения может быть определена до его передачи.

Это ДОЛЖНО и НЕ ДОЛЖНО.

0 голосов
/ 01 июля 2011

Вы должны изменить функцию, указав длину перед записью данных.

Например, вы можете сделать так, чтобы она выполняла обратный вызов Action<long>, а затем вызывать обратный вызов с длиной до записи в поток.
Ваша страница может затем передать length => Response.AddHeader("Content-Length", length.ToString()) в качестве обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...