[英]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.