发送文件时 FileStream 工作,MemoryStream 失败
FileStream works and MemoryStream fails when sending files
我试图通过将文件写入响应对象来将文件发送到请求。
我目前有两种方法。第一种方式(使用 FileStream
)有效,第二种方式(使用 MemoryStream
)失败。我想知道为什么第二种方式失败,因为我不想一直创建文件流。以下是代码
//This method does not work
MemoryStream ms = MethodA(bundleStream);
ms.CopyTo(Context.Response.Body); //<---Copy memory stream to response (Fails - object at other end is empty)
另一种方法有效。在这种方法中,我基本上写入一个文件,然后重新打开写入的文件并复制到 'Context.Response.Body'
//This method works.
MemoryStream ms = MethodB(bundleStream,"C:\Mytestfile.exe"); //Wrtie to Mytestfile.exe
ftest = new FileStream("C:\Mytestfile.exe", FileMode.Open); //Now open the same file that was written
ftest.CopyTo(Context.Response.Body); <---Copy file stream to response (Works)
ftest.Close();
我想知道为什么第一种方法失败了。显然,当我读取传入响应时它是空的,而使用第二种方法时我可以轻松读取响应。
从流中写入二进制数据时,您应该使用 OutputStream,而不是 body。 我猜 Body 是一个输出流,尽管我找不到任何关于 属性 Body here HttpWebResponse,我确实根据样本中的内容更改了代码。
这是您第一个代码部分的快速替换。此外,您应该在处理完流后处理它们。
using(MemoryStream ms = MethodA(bundleStream)) // dispose of ms after you are done with it
{
ms.Position = 0; // reset position
ms.CopyTo(Context.Response.Body); // write to output stream (assuming .Body is a Stream)
Context.Response.Body.Flush(); // flush response obj
}
Context.Response.End(); // end the response
在将内存流复制到请求流之前,您需要重置内存流的位置。
ms.Seek(0, SeekOrigin.Begin);
我试图通过将文件写入响应对象来将文件发送到请求。
我目前有两种方法。第一种方式(使用 FileStream
)有效,第二种方式(使用 MemoryStream
)失败。我想知道为什么第二种方式失败,因为我不想一直创建文件流。以下是代码
//This method does not work
MemoryStream ms = MethodA(bundleStream);
ms.CopyTo(Context.Response.Body); //<---Copy memory stream to response (Fails - object at other end is empty)
另一种方法有效。在这种方法中,我基本上写入一个文件,然后重新打开写入的文件并复制到 'Context.Response.Body'
//This method works.
MemoryStream ms = MethodB(bundleStream,"C:\Mytestfile.exe"); //Wrtie to Mytestfile.exe
ftest = new FileStream("C:\Mytestfile.exe", FileMode.Open); //Now open the same file that was written
ftest.CopyTo(Context.Response.Body); <---Copy file stream to response (Works)
ftest.Close();
我想知道为什么第一种方法失败了。显然,当我读取传入响应时它是空的,而使用第二种方法时我可以轻松读取响应。
从流中写入二进制数据时,您应该使用 OutputStream,而不是 body。 我猜 Body 是一个输出流,尽管我找不到任何关于 属性 Body here HttpWebResponse,我确实根据样本中的内容更改了代码。
这是您第一个代码部分的快速替换。此外,您应该在处理完流后处理它们。
using(MemoryStream ms = MethodA(bundleStream)) // dispose of ms after you are done with it
{
ms.Position = 0; // reset position
ms.CopyTo(Context.Response.Body); // write to output stream (assuming .Body is a Stream)
Context.Response.Body.Flush(); // flush response obj
}
Context.Response.End(); // end the response
在将内存流复制到请求流之前,您需要重置内存流的位置。
ms.Seek(0, SeekOrigin.Begin);