我正在尝试通过将文件写入响应对象来将文件发送到请求。
我目前有两种方式。第一种方式(使用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();
我想知道第一种方法失败的原因。显然当我读取传入的响应时它是空的,而我可以在使用第二种方法时轻松读取响应。
答案 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