如何缓冲输入流直到它完成

use*_*359 1 c# wcf stream

我正在实现一个接受图像流的wcf服务.但是当我运行它时,我正在获得异常.因为它试图在流完成之前获取流的长度.所以我想做的是缓冲流直到完成.但我无法找到任何如何做到这一点的例子......

有人可以帮忙吗?

我的代码到目前为止:

    public String uploadUserImage(Stream stream)
    {
          Stream fs = stream;

          BinaryReader br = new BinaryReader(fs);

          Byte[] bytes = br.ReadBytes((Int32)fs.Length);// this causes exception

          File.WriteAllBytes(filepath, bytes);
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

您应该从流中读取,直到它返回它已"完成",而不是尝试获取长度.在.NET 4中,这非常简单:

// Assuming we *really* want to read it into memory first...
MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Position = 0;
File.WriteAllBytes(filepath, memoryStream);
Run Code Online (Sandbox Code Playgroud)

在.NET 3.5中没有CopyTo方法,但您可以自己编写类似的东西:

public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[8192];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,现在我们有了复制流的东西,为什么还要先把它全部读入内存呢?让我们直接把它写到一个文件:

using (FileStream output = File.OpenWrite(filepath))
{
    CopyStream(stream, output); // Or stream.CopyTo(output);
}
Run Code Online (Sandbox Code Playgroud)