Próbuję wykonać kwerendy, która pobiera informacje od A Dynamics CRM z Simple OData biblioteki Client tak (C#):Jak włączyć kompresję gzip w prostym kliencie OData?
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));
}
Chociaż to działa, to jest bardzo powolny, ponieważ moje zapytanie na mss_transaccions tabela ma 7200 podmiotów. Patrzę na wyniki w Fiddler i widzę, że próbuje pobrać około 20 MB informacji.
Próbowałem uruchomić to samo zapytanie w przeglądarce Google Chrome i domyślnie uzyskano, że uzyskana odpowiedź jest skompresowana w formacie gzip, z 20 MB do około 500 KB. Więc dedukuję, że Prosty klient OData nie robi żadnej kompresji, i dlatego jest tak niesamowicie powolny.
Ponadto żądanie OData Simple Client prosi o informacje o metadanych, które dodają kolejne 4 MB, podczas gdy Chrome lub proste żądanie HttpClient nie musi wykonywać tego połączenia.
Czy jest coś, co mogę zrobić, aby to poprawić i włączyć kompresję?
Dziękuję.
Mam małe doświadczenie z klientem OData, ale czy istnieje sposób, aby sprawdzić/ustawić/zmodyfikować nagłówek "Accept-Encoding: gzip, deflate" na wychodzące żądanie? To powinno przynajmniej spowodować, że serwer uruchomi się i skompresuje. Miałoby to nadzieję, że klient użyje jakiegoś strumienia, który go rozpakuje. –
@MarvinSmit Dlatego właśnie nie jest to pytanie OData, ale pytanie Simple.Odata - które jest specyficzną biblioteką klienta. Biorąc pod uwagę, że wychodzące żądanie jest zarządzane przez bibliotekę, modyfikowanie go nie jest tak banalne, jak się wydaje (jeśli biblioteka go nie obsługuje). Technikalnie, tak, jeden "po prostu" musi podklasować HttpClient i sprawić, by przesłał informacje nagłówka kompresji ... ale jak to zrobić w SImple.Odata? Jestem w tej samej łodzi;) – TomTom
biorąc pod uwagę powyższy kod, oczekiwałbym "beforesend" -> "Headers.Add" typu akceptacji i dać mu spin? –