一个流中的多个流不会正确传递给客户端

在WCF服务中,我根据这个问题填写Stream,如:

result.Stream = new MemoryStream(); BinaryWriter writer = new BinaryWriter(result.Stream); foreach (string fileN in zipFiles) { byte[] fileBytes = File.ReadAllBytes(fileN); writer.Write(BitConverter.GetBytes(fileBytes.Length), 0, 4); writer.Write(fileBytes, 0, fileBytes.Length); } writer.Flush(); return result; 

在此之前我通过这个返回流,一切都在服务和客户端:

  result.Stream = new MemoryStream(File.ReadAllBytes(fileN)); 

Stream是MessageBodyMember但现在更改它以将所有文件保存在一个流中。

和客户端的测试方法:

  ExportClient export = new ExportClient("exportEndPoint"); ExportResult_C result = export.Export(source); result.Stream.Position = 0; //result.Stream.SaveToFile("d:\\kkk.log"); BinaryReader reader = new BinaryReader(result.Stream, System.Text.Encoding.UTF8); string pathToSave = string.Empty; while (result.Stream.Position < result.Stream.Length) { int size = reader.ReadInt32(); byte[] data = reader.ReadBytes(size); pathToSave = "D:\\test\\" + new Random().Next(0, 2564586).ToString() + ".zip"; File.WriteAllBytes(pathToSave, data); } 

端点地址:

   

和绑定配置:

             

我相信端点和绑定是正确的,因为我能够返回一个文件流并将其保存回来,但现在服务端没有问题,但是当它从客户端获得时,Stream丢失了它的内容,长度,位置。

这真的让我起了作用!

有谁知道为什么会这样(在客户端)?

哇,最后我成功地正确实现了我们的场景,在这里给出答案可能有人想使用该解决方案在一个流中返回多个文件。

有几个样本要返回多个文件但是所有这些都返回字节数组,我更喜欢返回流因为很多原因,重要的是流对大文件的性能会更好,因为不是所有文件都需要读入内存我的案例的一次性和向后兼容性。

所以在第一步我创建了一个可序列化的DataContract来保存文件名和它的内容字节。

 [DataContract] [Serializable] public class ExportSourceFiles_C { [DataMember] public string Name; [DataMember] public byte[] Content; } 

第二步 ,将创建ExportSourceFile_C列表,如:

 List sourceFiles = new List(); string[] zipFiles = Directory.GetFiles(zipRoot); foreach (string path in zipFiles) { byte[] fileBytes = File.ReadAllBytes(path); sourceFiles.Add(new ExportSourceFiles_C() { Name = Path.GetFileName(path), Content = fileBytes }); } 

第三步 ,提到的列表应序列化为result.Stream如:

  result.Stream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(result.Stream, sourceFiles); result.Stream.Position = 0; return result; 

在客户端这足以将流反序列化为ExportSourceFiles_C列表,因此客户端的最后一步应该是这样的:

  ExportClient export = new ExportClient("exportEndPoint"); ExportResult_C result = export.Export(source); BinaryFormatter formatter = new BinaryFormatter(); List deserialisedFiles = (List)formatter.Deserialize(result.Stream); foreach (ExportSourceFiles_C file in deserialisedFiles) File.WriteAllBytes("d:\\" + file.Name, file.Content); 

一切都像一个没有任何问题的魅力。

请享用。