OData中的解压缩gzip

本文关键字:gzip 解压缩 OData | 更新日期: 2023-09-27 18:21:57

我需要帮助解压缩gzip WCF数据服务响应,因为我已将IIS配置为压缩响应。我正在发送请求头Accept-Encoding gzip,deflate,但现在我找不到任何帮助,无法从DB(例如Clients)中获取所选实体。

这是我的代码:

DbServiceReference.MainDBEntities proxy;
string message;
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        proxy = new MainDBEntities(new Uri("http://localhost/DotConnectTest/MainDbDataServices.svc/"));

        proxy.BuildingRequest += proxy_BuildingRequest;
        proxy.ReceivingResponse += proxy_ReceivingResponse;

        txtBox.Text = proxy.Clients.FirstOrDefault().Name;
    }

    void proxy_ReceivingResponse(object sender, System.Data.Services.Client.ReceivingResponseEventArgs e)
    {   
        Stream stream = new GZipStream(e.ResponseMessage.GetStream(), CompressionMode.Decompress);
        message = Encoding.UTF8.GetString(ReadFully(stream)); // here I can Encode Response to string contains Client object in xml                         
    }
    public static byte[] ReadFully(Stream input)
    {
        byte[] buffer = new byte[16 * 1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }
    void proxy_BuildingRequest(object sender, System.Data.Services.Client.BuildingRequestEventArgs e)
    {
        KeyValuePair<string, string> header = new KeyValuePair<string,string>("Accept-Encoding", "gzip, deflate");
        if (!e.Headers.Contains(header))
            e.Headers.Add(header);      
    }

现在我得到一个错误:

无法将索引1处的字节[8B]从指定的代码页转换为Unicode。

在这部分代码中:

txtBox.Text = proxy.Clients.FirstOrDefault().Name;

我在教程中看到了如何使用ReadingResponse事件,但我认为在新版的数据服务ReadingResort中不存在事件。我只有ReceivingResponse事件,但在那里我无法覆盖收到消息的内容。

有什么办法解决这个问题吗?如何获取客户端名称并将其设置为textBox.Text属性?

OData中的解压缩gzip

好吧,我终于知道如何解决我的问题了!

我使用发送请求2

void proxy_SendingRequest2(object sender, System.Data.Services.Client.SendingRequest2EventArgs e)
    {
        var Request = ((HttpWebRequestMessage)e.RequestMessage).HttpWebRequest;
        Request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    }