2016-04-25 56 views
5

我试图执行从CRM动态,像这样(C#)简单的OData客户端库检索信息的查询:如何在Simple OData Client中启用gzip压缩?

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。所以我推断简单OData客户端没有进行任何类型的压缩,这就是为什么它非常慢。

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

有什么我可以做的,以改善这一点,并启用压缩?

谢谢。

+0

我对OData客户端有一点经验,但是有没有办法可以检查/设置/修改传出请求上的“Accept-Encoding:gzip,deflate”标头?至少应该让服务器启动并压缩它。然后它会希望客户端使用一些解压缩它的流。 –

+0

@MarvinSmit这就是为什么这不是一个OData问题,而是一个Simple.Odata问题 - 这是一个特定的客户端库。鉴于传出请求是由库管理的,修改它并不像听起来那么简单(如果库不支持它)。技术上,是的,一个“只”必须继承HttpClient的子类并使其提交压缩标题信息....但是如何在SImple.Odata中执行此操作?我在同一条船上;) – TomTom

+0

上面给出你的代码,我期望接受类型的“beforesend” - >“Headers.Add”,并给它一个旋转? –

回答

1

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

简单快速的把它放下,你只需要修改的ODataSettings实例的消息处理程序与下面的代码:

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

现在HTTPRequests的都会以gzip的形式发送,并在正确响应时放气并解压缩。

1

如果您检查哪些标头发送Chrome并尝试在C#中复制它们?另外,如果我必须从C#访问CRM,我会使用Microsoft.Xrm.Sdk而不是OData。你有大量的代理类型和请求,可以让你编写更清晰的代码。 OData还存在QueryExpressions/CRM LINQ/FetchXml不具备的其他限制。

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

2

在你BeforeRequest行动,添加Accept-Encoding标题如下:

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