繁体   English   中英

如何在Simple OData Client中启用gzip压缩?

[英]How to enable gzip compression in Simple OData Client?

我正在尝试使用像这样的简单OData客户端库(C#)执行从CRM Dynamics检索信息的查询:

var settings = new ODataClientSettings(resource + "/api/data/v8.0/");
settings.BeforeRequest = (request) =>
    {
        request.Headers.Clear();
        request.Headers.Add("Authorization", accesstoken.AccessTokenType + " " + accesstoken.AccessToken);
    };

settings.PayloadFormat = ODataPayloadFormat.Json;
var client = new ODataClient(settings);
var annotations = new ODataFeedAnnotations();

var transactions = await client.For("mss_transaccions").FindEntriesAsync(annotations);
while (annotations.NextPageLink != null)
{
    transactions = transactions.Union(await client.For("mss_transaccions").FindEntriesAsync(annotations.NextPageLink, annotations));
}

虽然这有效,但它非常慢,因为我对mss_transaccions表的查询有7200个实体。 我正在看Fiddler的输出,我可以看到它正在尝试下载大约20 MB的信息。

我试图在谷歌浏览器上运行相同的查询,我可以看到默认情况下获得的响应以gzip格式压缩,从20MB到仅仅500KB。 所以我推断Simple OData Client没有进行任何压缩,这就是为什么它非常慢。

此外,来自OData Simple Client的请求要求提供另外4MB的元数据信息,而Chrome或简单的HttpClient请求则不需要进行该调用。

有什么我可以做的来改善它并启用压缩吗?

谢谢。

BeforeRequest操作中,添加Accept-Encoding标头,如下所示:

settings.BeforeRequest = (request) =>
{
    // ... other headers as above
    request.Headers.Add("Accept-Encoding", "gzip");
};

我已经能够最终启用压缩并加快整个过程。 整个讨论可以在这里找到: https//github.com/object/Simple.OData.Client/issues/238

要简单快速地放下它,您只需要使用以下代码修改ODataSettings实例中的消息处理程序:

settings.OnApplyClientHandler = handler =>
            {
                handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
            };

现在,httpRequests以gzip形式发送,通过正确响应进行deflate和解压缩。

如果您检查哪些标头正在发送Chrome并尝试在C#中复制它们?

此外,如果我必须从C#访问CRM,我将使用Microsoft.Xrm.Sdk而不是OData。 您有大量的代理类型和请求,可以让您编写更清晰的代码。 OData还有其他限制,QueryExpressions / CRM LINQ / FetchXml也没有。

OData对JS代码更有意义(即来自CRM表单的请求)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM