2016-04-25 6 views
5

Ich versuche, eine Abfrage auszuführen, die Informationen aus einem CRM Dynamics mit der Simple OData-Client-Bibliothek wie dieser (C#) ruft:Wie aktiviert man die gzip-Komprimierung im Simple OData Client?

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

Das funktioniert zwar, ist es extrem langsam, weil meine Abfrage auf dem mss_transaccions Tabelle hat 7200 Einheiten. Ich schaue auf die Ausgabe in Fiddler und ich kann sehen, dass es versucht, etwa 20 MB Informationen herunterzuladen.

Ich habe versucht, die gleiche Abfrage auf Google Chrome auszuführen, und ich konnte sehen, dass standardmäßig die erhaltene Antwort im Gzip-Format komprimiert wird, von 20 MB auf nur 500 KB. Ich folge daher, dass der Simple OData Client keine Komprimierung ausführt und deshalb so langsam ist.

Darüber hinaus fragt die Anfrage von OData Simple Client nach Metadaten Informationen, die weitere 4MB hinzufügen, während Chrome oder eine einfache HttpClient Anfrage diesen Aufruf nicht machen müssen.

Gibt es etwas, was ich tun kann, um das zu verbessern und die Komprimierung zu aktivieren?

Vielen Dank.

+0

Ich habe wenig Erfahrung mit dem OData-Client, aber gibt es eine Möglichkeit, die Header "Accept-Encoding: gzip, deflate" auf der ausgehenden Anfrage zu überprüfen/setzen/ändern? Das sollte zumindest den Server hereintreten lassen und ihn komprimieren. Es würde dann hoffen, dass der Client einen Strom verwendet, der ihn dekomprimiert. –

+0

@MarvinSmit Dies ist, warum dies keine OData-Frage ist, sondern eine Simple.Odata-Frage - das ist eine bestimmte Client-Bibliothek. Wenn die ausgehende Anforderung von einer Bibliothek verwaltet wird, ist ihre Änderung nicht so trivial wie sie klingt (wenn die Bibliothek dies nicht unterstützt). Technisch gesehen, ja, man muss "nur" den HttpClient ableiten und dafür sorgen, dass er die Kompressions-Header-Information übermittelt .... aber wie geht das in Simple.Odata? Ich bin im selben Boot;) – TomTom

+0

gegeben Ihren Code oben, würde ich erwarten, dass ein "predesend" -> "Headers.Add" der akzeptieren Art und geben Sie eine Drehung? –

Antwort

1

Ich habe in der Lage endlich die Komprimierung zu aktivieren und den gesamten Prozess zu beschleunigen. Die ganze Diskussion ist hier zu finden: https://github.com/object/Simple.OData.Client/issues/238

es einfach und schnell zu legen, man muss nur mit dem folgenden Code die Nachrichtenhandler in der ODataSettings Instanz ändern:

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

Nun ist die httpRequests werden als gzip gesendet, deflate und dekomprimiert bei der Antwort richtig.

1

Wenn Sie überprüfen, welche Header Chrome senden und versuchen, sie in C# zu replizieren?

Wenn ich auf CRM von C# zugreifen muss, würde ich die Microsoft.Xrm.Sdk im Gegensatz zu OData verwenden. Sie haben viele Proxy-Typen und -Anforderungen, mit denen Sie Code viel sauberer schreiben können. OData hat andere Einschränkungen, die auch QueryExpressions/CRM LINQ/FetchXml nicht haben.

OData würde mehr Sinn machen für JS-Code (d. H. Anfragen von einem CRM-Formular).

2

In Ihrer BeforeRequest Aktion, fügen Sie die Accept-Encoding Header wie folgt:

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