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

C# FileStream工作,发送文件时MemoryStream失败,c#,filestream,httpwebresponse,memorystream,C#,Filestream,Httpwebresponse,Memorystream,我试图通过将文件写入响应对象来向请求发送文件。 我现在有两种方法。第一种方法(使用FileStream)有效,第二种方法(使用MemoryStream)失败。我想知道为什么第二种方法失败了,因为我不想一直创建文件流。下面是代码 //This method does not work MemoryStream ms = MethodA(bundleStream); ms.CopyTo(Context.Response.Body); //<---Copy memory

我试图通过将文件写入响应对象来向请求发送文件。 我现在有两种方法。第一种方法(使用
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)
我想知道为什么第一种方法失败了。显然,当我读取传入响应时,它是空的,而当使用第二种方法时,我可以轻松地读取响应。

从流中写入二进制数据时,应该使用OutputStream,而不是正文。我猜Body是一个输出流,虽然我在这里找不到任何关于属性Body的内容,但我确实根据您的示例中的内容更改了代码

下面是第一个代码部分的快速替换。此外,您还应在处理完流后将其处理掉

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);

您应该写入
响应。OutputStream
,而不是正文。请提供(因为返回不可读/空流的
MethodA
中可能存在问题)。此外,基本搜索提供了即时答案-因此,您可以澄清在提问之前您尝试了什么。@AlexeiLevenkov,如果您注意到答案与methodA或methodB无关。这和seek有关。标记的答案表明。我删除methodA和methodB的原因是为了使问题简短明了。不需要向下投票。假设
MethodA
中的代码在返回调用方之前正确地创建了新流(即
new MemoryStream(allBytesFromFile)
当前代码不可能产生您所说的错误。并且您不需要“修复”。请注意,通常您应该以“object disposed”结束如果
MethodA
中的代码至少会遵循处理
IDisposable
对象的良好实践,则会出现例外情况……我真的不明白你所说的
MethodA
与问题无关。投票表决你的答案,因为它更完整。
ms.Seek(0, SeekOrigin.Begin);