FileStream工作,MemoryStream在发送文件时失败

时间:2016-02-23 01:46:47

标签: c# filestream httpwebresponse memorystream

我正在尝试通过将文件写入响应对象来将文件发送到请求。 我目前有两种方式。第一种方式(使用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();

我想知道第一种方法失败的原因。显然当我读取传入的响应时它是空的,而我可以在使用第二种方法时轻松读取响应。

2 个答案:

答案 0 :(得分:3)

在将内存流复制到请求流之前,需要重置内存流的位置。

EditText

答案 1 :(得分:2)

你应该使用OutputStream,而不是从流中写入二进制数据时的主体。我猜Body是一个输出流,虽然我找不到任何关于属性Body的内容{{3}我确实根据你样本中的内容更改了代码。

这是您第一个代码部分的快速替代品。你完成它们之后也应该处理它们。

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