【问题标题】:Support compression in .NET OData 4 Client.NET OData 4 客户端支持压缩
【发布时间】:2014-10-13 20:57:35
【问题描述】:

问题

我在自托管的 OWIN/Katana Web API OData 4 服务中添加了对 http 压缩的支持,但我看不到如何在 .NET 客户端中支持压缩。我正在使用 OData 库 v6.5.0,我需要支持客户端中的压缩/解压缩 (OData v4 Client Code Generator)。我正在使用 Deflate 编码通过 ActionFilter 进行压缩。正如通过 Fiddler 确认的那样,所有内容都在服务器上正确压缩,但我不知道如何配置客户端以支持这一点,因为 OData 客户端使用请求和响应管道而不是现在已失效的 WritingRequest and RecievingResponse events that once supported this very scenario

尝试

通过实验,我发现我可以在DataServiceContext 上挂接ReceivingResponse 事件,然后调用 ReceivingResponseEventArgs.ResponseMessage.GetStream() 但我不知道如何正确覆盖消息内容。如果我在流上 CopyTo(),我会在 Microsoft.OData.Core.ODataMessageReader.DetectPayloadKind() 处获得空引用异常。我认为这是因为流被读取到末尾并且位置需要设置回零,但我不能这样做,因为流在​​设置位置时也会引发异常,因为它说它不支持搜索。我认为这仅仅是因为流是只读的。即使我可以复制流以成功解压,如何使用解压后的内容修改响应消息内容?我在 RequestPipeline 或 ResponsePipeline 中根本看不到任何挂钩。为了澄清,我想解压缩响应消息内容,然后将其设置为稍后发生的具体化,我该怎么做?如何将压缩请求也发送到 OData 服务的额外功劳。谢谢!

【问题讨论】:

    标签: odata wcf-data-services asp.net-web-api astoria wcf-data-services-client


    【解决方案1】:

    OData客户端使用HTTPWebRequest和HTTPWebReponse,很好的支持压缩。尝试在 SendingRequest2 管道事件中将 HTTPWebRequest 的 AutomaticDecompression 设置为 Deflate 或 GZip,如下所示:

    private void OnSendingRequest_(object sender, SendingRequest2EventArgs args)
    {
        if (!args.IsBatchPart) // The request message is not HttpWebRequestMessage in batch part.
        {
            HTTPWebRequest request = ((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest;
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
        } 
    }
    

    然后作为响应,HTTPWebResponse 将在具体化工作之前自动解压流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 2016-02-05
      相关资源
      最近更新 更多