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"); 
};