使用.NET 4.0,IIS 7.5(Windows Server 2008 R2)。我想流出大约10 MB的二进制内容。内容已经在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();
}
提前感谢您的帮助。
我没有尝试传递原始数据流的第二个建议。内存流确实是从Web请求的响应流中填充的。这是代码,
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()?
答案 0 :(得分:2)
第二个选项是最好的选项,因为ToArray实际上会创建存储在MemoryStream中的内部数组的副本。
但是,您也可以使用memoryStr.GetBuffer()
来返回对此内部数组的引用。在这种情况下,您需要使用memoryStr.Length
属性,因为GetBuffer()返回的缓冲区通常大于存储的实际数据(它按块分配块,而不是逐字节分配)。
请注意,最好将原始数据作为流直接传递给ASP.NET输出流,而不是使用中间MemoryStream。这取决于你如何获得二进制数据。
如果您经常提供完全相同的内容,则另一个选项是将此MemoryStream保存到物理文件(使用FileStream),并对所有后续请求使用Response.TransmitFile。 Response.TransmitFile使用的是低级Windows套接字层,发送文件没有什么比这更快了。