Потоковый вывод ASP.NET: 1 один большой кусок против X меньших блоков? - PullRequest
2 голосов
/ 13 мая 2011

Использование .NET 4.0, IIS 7.5 (Windows Server 2008 R2).Я хотел бы вывести двоичный контент размером около 10 МБ.Содержимое уже находится в MemoryStream.Интересно, если IIS7 автоматически чанкирует поток вывода.От клиента, получающего поток, есть ли разница между этими двумя подходами:

//#1: Output the entire stream in 1 single chunks
Response.OutputStream.Write(memoryStr.ToArray(), 0, (int) memoryStr.Length);
Response.Flush();

//#2: Output by 4K chunks
byte[] buffer = new byte[4096];
int byteReadCount;
while ((byteReadCount = memoryStr.Read(buffer, 0, buffer.Length)) > 0)
{
   Response.OutputStream.Write(buffer, 0, byteReadCount);
   Response.Flush();
}

Заранее спасибо за любую помощь.


Я не пробовал ваше второе предложение прохожденияисходный поток данных.Поток памяти действительно заполняется из потока ответа веб-запроса.Вот код,

HttpWebRequest webreq = (HttpWebRequest) WebRequest.Create(this._targetUri);
using (HttpWebResponse httpResponse = (HttpWebResponse)webreq.GetResponse())
{
   using (Stream responseStream = httpResponse.GetResponseStream())
   {
      byte[] buffer = new byte[4096];
      int byteReadCount = 0;
      MemoryStream memoryStr = new MemoryStream(4096);
      while ((byteReadCount = responseStream.Read(buffer, 0, buffer.Length)) > 0)
      {
         memoryStr.Write(buffer, 0, byteReadCount);
      }
      // ... etc ... //
   }
}

Как вы думаете, он может безопасно передать responseStream в Response.OutputStream.Write ()?Если да, можете ли вы предложить экономичный способ сделать это?Как отправить ByteArray + точную длину потока в Response.OutputStream.Write ()?

1 Ответ

2 голосов
/ 16 мая 2011

Второй вариант является лучшим, так как ToArray фактически создает копию внутреннего массива, хранящегося в MemoryStream.

Но вы также можете предпочтительно использовать memoryStr.GetBuffer(), который будет возвращать ссылку на этовнутренний массив.В этом случае вам нужно использовать свойство memoryStr.Length, поскольку буфер, возвращаемый функцией GetBuffer (), в общем случае больше, чем хранимые фактические данные (он выделяется фрагментом по фрагменту, а не по байту).

Примечаниечто было бы лучше передать исходные данные в виде потока непосредственно в выходной поток ASP.NET, вместо использования промежуточного MemoryStream.Во-первых, это зависит от того, как вы получаете двоичные данные.

Другой вариант, если вы часто обслуживаете одно и то же содержимое, - это сохранить MemoryStream в физический файл (используя FileStream) и использовать Response.TransmitFile на все последующие запросы.Response.TransmitFile использует низкоуровневые слои сокетов Windows, и нет ничего быстрее, чтобы отправить файл.

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