如何在 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 table 的查询有 7200 个实体。我正在查看 Fiddler 中的输出,我可以看到它正在尝试下载大约 20 MB 的信息。

我尝试 运行 在 Google Chrome 上进行相同的查询,我可以看到默认情况下,获得的响应以 gzip 格式压缩,从 20MB 到仅仅一些500KB。所以我推断 Simple OData Client 没有进行任何类型的压缩,这就是它非常慢的原因。

此外,来自 OData Simple Client 的请求要求元数据信息,这又增加了 4MB,而 Chrome 或简单的 HttpClient 请求不需要进行该调用。

我能做些什么来改进它并启用压缩吗?

谢谢。

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

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

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

在您的 BeforeRequest 操作中,添加 Accept-Encoding header 如下:

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 格式发送,在响应时正确压缩和解压缩。