0

问题

我在我们的自托管 OWIN/Katana Web API OData 4 服务中添加了对 http 压缩的支持,但我看不到如何在 .NET 客户端中支持压缩。我正在使用 OData 库 v6.5.0,我需要在客户端(OData v4 客户端代码生成器)中支持压缩/解压缩。我正在通过 ActionFilter 使用 Deflate 编码进行压缩。正如通过 Fiddler 确认的那样,一切都在服务器上正确压缩,但我不知道如何配置客户端以支持这一点,因为 OData 客户端使用请求和响应管道,而不是曾经支持这种场景的现已失效的 WritingRequest 和 RecievingResponse 事件

尝试

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

4

1 回答 1

3

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 将在具体化工作之前自动解压缩流。

于 2014-08-21T03:52:49.233 回答