在c#中使用GZipStream压缩数据并将其上传到webservice

本文关键字:webservice 数据 压缩 GZipStream | 更新日期: 2023-09-27 18:03:55

我有一个XML数据,我想使用GZipStream压缩它并将其上传到webservice。我想在内存中创建gzip文件,而不是在本地磁盘中创建它。我尝试了以下操作:

public string class1(string url, string xml)
{
byte[] data = Encoding.ASCII.GetBytes(xml);
                    MemoryStream memory = new MemoryStream();
                    GZipStream gzip = new GZipStream(memory, CompressionMode.Compress, true);                    
                    gzip.Write(data, 0, data.Length);                       
                    byte[] zip=memory.ToArray();
HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(url);
                    wReq.Method = "POST";
                    wReq.ContentType = "application/zip";
                    var reqStream = wReq.GetRequestStream();
                    reqStream.Write(zip,0,zip.Length);
                    reqStream.Close();
                    var wRes = wReq.GetResponse();
                    var resStream = wRes.GetResponseStream();
                    var resgzip = new GZipStream(resStream, CompressionMode.Decompress);
                    var reader = new StreamReader(resgzip);
                    var textResponse = reader.ReadToEnd();
                    reader.Close();
                    resStream.Close();
                    wRes.Close();
                    return textResponse;
}

将数据写入webservice后,服务器解压缩文件并处理它。当服务器解压缩数据时,在服务器中抛出异常"文件过早结束"。

在c#中使用GZipStream压缩数据并将其上传到webservice

添加以下方法将Stream转换为MemoryStream

 public static MemoryStream Read(Stream stream)
{
    MemoryStream memStream = new MemoryStream();
    byte[] readBuffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) > 0)
        memStream.Write(readBuffer, 0, bytesRead);
    return memStream;
}

则调用如下。

var wRes = wReq.GetResponse();                    
var memstream = Read(wRes.GetResponseStream()); 
var resgzip = new GZipStream(memstream, CompressionMode.Decompress);
var reader = new StreamReader(resgzip);
var textResponse = reader.ReadToEnd();