【问题标题】:How to enable gzip compression in Simple OData Client?如何在 Simple OData Client 中启用 gzip 压缩?
【发布时间】:2016-04-25 12:35:36
【问题描述】:

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

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 的信息。

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

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

我可以做些什么来改进它并启用压缩?

谢谢。

【问题讨论】:

  • 我对 OData 客户端几乎没有经验,但是有没有办法可以检查/设置/修改传出请求上的“Accept-Encoding: gzip, deflate”标头?那至少应该让服务器启动并压缩它。然后它会希望客户端使用一些解压缩它的流。
  • @MarvinSmit 这就是为什么这不是 OData 问题而是 Simple.Odata 问题 - 这是一个特定的客户端库。鉴于传出请求由库管理,修改它并不像听起来那么简单(如果库不支持它)。从技术上讲,是的,一个“只是”必须继承 HttpClient 并使其提交压缩头信息....但是如何在 SIMple.Odata 中做到这一点?我在同一条船上;)
  • 鉴于您上面的代码,我希望接受类型的“beforesend”->“Headers.Add”并给它一个旋转?

标签: c# .net compression odata dynamics-crm


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    现在 httpRequests 以 gzip、deflate 和正确解压缩的形式发送。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 2014-09-26
        • 2018-08-20
        • 2013-01-08
        相关资源
        最近更新 更多