GZipStream 解压器 = new GZipStream((MemoryStream)流, CompressionMode.Decompress);
String 解压后 = new StreamReader(解压器).ReadToEnd();哪位熟悉GZipStream的,看看我解压内存流数据,返回的总是空值,很简单的2行代码,哪里不对?fsdfdsfdf

解决方案 »

  1.   

    using (Stream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
    {
        if (stream == null)
            return "GetResponseStream为null";    using (var sr = new StreamReader(stream, Encoding.UTF8))
        {
            var html = sr.ReadToEnd();
        }
    }
    我比你多了一个Encoding,使用很多年了,没出过问题
      

  2.   


                string responseStr = string.Empty;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (Stream receiveStream = response.GetResponseStream())
                {
                    if (receiveStream != null)
                    {
                        if (response.ContentEncoding.ToLower().Contains("gzip"))
                        {
                            using (GZipStream stream = new GZipStream(receiveStream, CompressionMode.Decompress))
                            {
                                using (StreamReader readStream = new StreamReader(stream, Encoding.UTF8))
                                {
                                    responseStr = readStream.ReadToEnd();
                                }
                            }
                        }
                        else
                        {
                            using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
                            {
                                responseStr = readStream.ReadToEnd();
                            }
                        }
                    }
                }
      

  3.   

    检查下你【解压器】对象Postion是否为0,不为 0 需要重新设置:
    解压器.Seek(0, SeekOrigin.Begin);
      

  4.   

    监视Postion是0
    加上Encoding.UTF8,结果也一样,可以排除编码问题了。会不会是参数传递时产生的问题呢?async void 调用()
    {
        Byte[] 缓冲 = new Byte[10240];
        WebSocketReceiveResult 字节 = await 客户端.ReceiveAsync(new ArraySegment<Byte>(缓冲), CancellationToken.None);
        ThreadPool.QueueUserWorkItem(new WaitCallback(解析), new MemoryStream(缓冲, 0, 字节.Count));
    }
    void 解析(Object 流)
    {
        GZipStream 解压器 = new GZipStream(流 as Stream, CompressionMode.Decompress);
        String 解压后 = new StreamReader(解压器, Encoding.UTF8).ReadToEnd();    //为空值
    }
      

  5.   

    这句代码是不是要改下?
    ThreadPool.QueueUserWorkItem(new WaitCallback(解析), new MemoryStream(缓冲, 0, 字节.Count));
    改成
    ThreadPool.QueueUserWorkItem(new WaitCallback(解析), new MemoryStream(字节, 0, 字节.Count));
      

  6.   

    尝试直接将传来的参数用StreamReader读出来再转String是有内容的,内容是乱码,应该是等待解压的数据。放到GZipStream里去过一遍之后,就什么都没有了。GZipStream 解压器 = new GZipStream(流 as Stream, CompressionMode.Decompress);
    String 解压后 = new StreamReader(解压器, Encoding.UTF8).ReadToEnd();那么问题应该还是出在这两行里面了。
      

  7.   

    public GZipStream(Stream stream, CompressionMode mode, bool leaveOpen)构造函数里面的
    leaveOpenType: System.Boolean
    如果在释放 GZipStream 对象之后打开流,则为 true;否则为 false。
    这个参数控制什么呢?能举个例子吗?
      

  8.   

    反编译代码看一下你就知道了,就是释放GZipStream时,要不要关闭源Stream:
    protected override void Dispose(bool disposing)
    {
        try
        {
        this.PurgeBuffers(disposing);
        }
        finally
        {
        try
        {
            if (disposing)
            {
            if (!this._leaveOpen)
            {
                if (this._stream != null)
                this._stream.Close();
            }
            }
      

  9.   

    可能是seek(0,begin)的问题