问题
我在我们自己托管的OWIN/Katana Web 4服务中添加了对http压缩的支持,但我不知道如何在.NET客户机中支持压缩。我使用的是OData库v6.5.0,我需要在客户机(OData v4客户端代码生成器)中支持压缩/解压缩。我正在使用Deflate编码来通过ActionFilter进行压缩。正如通过Fiddler确认的那样,服务器上的所有内容都是正确压缩的,但是我不知道如何配置客户机来支持这一点,因为OData客户机使用请求和响应管道而不是现在已经失效的曾经支持这种场景的WritingRequest和RecievingResponse事件。
尝试
通过实验,我发现我可以连接到我的ReceivingResponseEventArgs.ResponseMessage.GetStream()上的ReceivingResponse事件,然后调用DataServiceContext,但是我不知道如何正确地覆盖消息内容。如果流上的是CopyTo(),那么在CopyTo上会得到一个空引用异常。我认为这是因为流被读取到末尾,需要将位置设置为零,但我不能这样做,因为流在设置位置时也抛出异常,因为它表示不支持搜索。我想这仅仅是因为流是只读的。即使我可以复制流以成功地解压缩它,我如何用解压缩的内容修改响应消息内容?在RequestPipeline或ResponsePipeline中,我根本没有看到这方面的任何挂钩。为了澄清,我想解压缩响应消息内容,然后将其设置为随后发生的物化,我该如何做呢?对于如何也向OData服务发送压缩请求提供了额外的奖励。谢谢!
发布于 2014-08-21 03:52:49
OData客户端使用HTTPWebRequest和HTTPWebReponse,它们很好地支持压缩。尝试将AutomaticDecompression of HTTPWebRequest设置为Deflate或GZip,在SendingRequest2管道事件中,如下所示:
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将在物化工作之前自动解压流。
https://stackoverflow.com/questions/25405774
复制相似问题