2016-04-25 6 views
5

私はこの(C#の)のようなシンプルなのODataクライアントライブラリでCRMダイナミクスから情報を取得するクエリを実行しようとしています: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の情報をダウンロードしようとしていることがわかります。

私はGoogle Chromeで同じクエリを実行しようとしましたが、デフォルトでは、取得されたレスポンスはgzip形式で圧縮され、20MBからわずか500KBに圧縮されています。だから私は、単純なODataクライアントはどんな種類の圧縮も行っていないと推測しています。そのため、それは非常に遅いです。

さらに、OData Simple Clientからのリクエストにより、メタデータ情報が要求されます。これにはさらに4MBが追加されますが、Chromeや単純なHttpClientリクエストではその呼び出しを行う必要はありません。

これを改善して圧縮を有効にするためにできることはありますか?

ありがとうございます。

+0

私はODataクライアントの経験はほとんどありませんが、送信要求の "Accept-Encoding:gzip、deflate"ヘッダーを確認/設定/変更する方法はありますか?それは少なくとも、サーバーを起動して圧縮する必要があります。クライアントは、それを解凍するストリームを使用することを望んでいます。 –

+0

@MarvinSmitこれはODataの質問ではなく、特定のクライアントライブラリであるSimple.Odataの質問です。発信要求がライブラリによって管理されているとすれば、それを変更することはそれほど簡単ではありません(ライブラリがそれをサポートしていない場合)。技術的には、はい、ちょうど1つは、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にアクセスする必要がある場合は、ODataではなくMicrosoft.Xrm.Sdkを使用します。プロキシの種類と要求がたくさんあり、コードをもっときれいに書くことができます。 ODataには、QueryExpressions/CRM LINQ/FetchXmlには他の制限もありません。

ODataは、JSコード(CRMフォームからのリクエスト)の方が意味があります。あなたのBeforeRequestアクションで

2

、次のようにAccept-Encodingヘッダを追加します。

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