none
关于WCF大数据传输 RRS feed

  • 问题

  • public byte[] Compression(byte[] data, CompressionMode mode) 
        {
          DeflateStream zip = null;
          try
          {
            if (mode == CompressionMode.Compress)
            {
              MemoryStream ms = new MemoryStream();
              zip = new DeflateStream(ms, mode, true);
              zip.Write(data, 0, data.Length);
              zip.Close();
              return ms.ToArray();
            }
            else
            {
              MemoryStream ms = new MemoryStream();
              ms.Write(data, 0, data.Length);
              ms.Flush();
              ms.Position = 0;
       
              MemoryStream os = new MemoryStream();
    
              zip = new DeflateStream(ms,CompressionMode.Decompress);
              zip.CopyTo(os);
              
              zip.Close();
              return os.ToArray();
            }
          }
          catch
          {
            if (zip != null) zip.Close();
            return null;
          }
          finally 
          {
            if (zip != null) zip.Close();
          }
        }
    
    

    关于WCF大数据传输,借鉴了网上一些朋友的思路。假设读取本地一个文件用于传输,大体思路是:FileStream 读到 MemoryStream ,将该MemoryStream 使用Compression压缩,返回一个字节数组,将次数组分段发给客户端,客户端不断接受分段数组,写进一个MemoryStream中,将该MemoryStream使用Compression解压,再写到本地。

    压缩解压方法如上。

    问题是,如果不是用WCF,仅仅是在console中写个测试的工程,那么传输无问题,但是加入WCF之后,客户端解压的时候在 zip.CopyTo(os) 会有如下错误:

    有时是Unknown block type. Stream might be corrupted.  有时是Found invalid data while decoding

    好奇怪啊 也找不到原因

    大家帮帮忙  THX

     


    Dude....
    2011年3月3日 2:31

答案

  • 是不是数据传输的时候有丢失?

    看到一个老外的帖子

    一样的问题。

    你是压缩和解压缩的问题。

    GZipStream and DeflateStream 使用了相同的压缩算法,但是GZip包含头信息。

    修改的代码:

         // Read the file we are going to compress into a FileStream
            string filename = Server.MapPath("wizard.zip");

            FileStream infile = File.OpenRead(filename);
            GZipStream gzipStream = new GZipStream(infile, CompressionMode.Decompress);

            byte[] buffer = new byte[infile.Length + 100];

            gzipStream.Read(buffer, 0, (int) infile.Length);
            string x = Encoding.ASCII.GetString(buffer);

    参考一下这个帖子:
    http://p2p.wrox.com/c-2005/63731-using-deflatestream-read-gives-exception.html


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年3月3日 9:22
    版主

全部回复