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

本文关键字:文件 失败 MemoryStream 工作 FileStream | 更新日期: 2023-09-27 18:35:56

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

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

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

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

ms.Seek(0, SeekOrigin.Begin);

从流写入二进制数据时,应使用 OutputStream,而不是正文。我想 Body 是一个输出流,尽管我在这里找不到有关属性 Body 的任何内容 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