2016-04-25 6 views
5

मैं एक प्रश्न है कि इस प्रकार (सी #) सरल OData ग्राहक पुस्तकालय के साथ एक सीआरएम गतिशीलता से जानकारी ले कर प्रदर्शन करने के लिए कोशिश कर रहा हूँ:सरल ओडाटा क्लाइंट में 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 इकाइयां हैं। मैं फिडलर में आउटपुट देख रहा हूं और मैं देख सकता हूं कि यह लगभग 20 एमबी जानकारी डाउनलोड करने की कोशिश कर रहा है।

मैंने Google क्रोम पर एक ही क्वेरी चलाने की कोशिश की, और मैं देख सकता था कि डिफ़ॉल्ट रूप से प्राप्त प्रतिक्रिया जीजीआईपी प्रारूप में संपीड़ित होती है, जो 20 एमबी से कुछ मात्र 500 केबी तक जाती है। इसलिए मैं यह समझ रहा हूं कि सरल ओडाटा क्लाइंट किसी भी प्रकार का संपीड़न नहीं कर रहा है, और यही कारण है कि यह बहुत धीमी है।

इसके अतिरिक्त, ओडाटा सरल क्लाइंट का अनुरोध मेटाडेटा जानकारी मांगता है, जो एक और 4 एमबी जोड़ता है, जबकि क्रोम या एक साधारण एचटीपी क्लाइंट अनुरोध को उस कॉल को करने की आवश्यकता नहीं होती है।

क्या ऐसा कुछ भी है जो मैं इसे सुधारने और संपीड़न को सक्षम करने के लिए कर सकता हूं?

धन्यवाद।

+0

मुझे ओडाटा क्लाइंट के साथ थोड़ा सा अनुभव नहीं है, लेकिन क्या कोई तरीका है कि आप आउटगोइंग अनुरोध पर "स्वीकृति-एन्कोडिंग: gzip, deflate" शीर्षलेख को चेक/सेट/संशोधित कर सकते हैं? उसमें कम से कम सर्वर को लात मारना चाहिए और इसे संपीड़ित करना चाहिए। यह तब उम्मीद कर रहा होगा कि क्लाइंट कुछ धाराओं का उपयोग करता है जो इसे डिकंप्रेस करता है। –

+0

@MarvinSmit यही कारण है कि यह ओडाटा प्रश्न नहीं है लेकिन एक सरल। ओडाटा प्रश्न - जो एक विशिष्ट ग्राहक पुस्तकालय है। यह देखते हुए कि आउटगोइंग अनुरोध लाइब्रेरी द्वारा प्रबंधित किया जाता है, इसे संशोधित करना उतना छोटा नहीं है जितना लगता है (यदि पुस्तकालय इसका समर्थन नहीं करता है)। तकनीकी रूप से, हां, एक "बस" को HttpClient को उपclass करना है और इसे संपीड़न शीर्षलेख जानकारी सबमिट करना है .... लेकिन सिमप्ल.ऑडाटा में ऐसा कैसे करें? मैं एक ही नाव में हूं;) – TomTom

+0

ऊपर अपना कोड दिया गया है, मैं स्वीकार करता हूं कि "beforesend" -> "हेडर। स्वीकार करें" स्वीकार करें और इसे स्पिन दें? –

उत्तर

1

मैं अंत में संपीड़न सक्षम और समग्र प्रक्रिया में तेजी लाने के लिए सक्षम किया गया है। पूरे चर्चा यहां पाया जा सकता: https://github.com/object/Simple.OData.Client/issues/238

यह रखना करने के लिए नीचे बस और जल्दी से, आप बस कोड का निम्न भाग के साथ ODataSettings उदाहरण में संदेश हैंडलर संशोधित करने की आवश्यकता: अब httpRequests

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

प्रतिक्रिया पर gzip, deflate और decompressed के रूप में भेजा जाता है।

1

यदि आप निरीक्षण करते हैं कि कौन से शीर्षलेख क्रोम भेज रहे हैं और उन्हें सी # में दोहराने का प्रयास करें?

इसके अलावा, अगर मुझे सी # से सीआरएम तक पहुंचना है, तो मैं ओडाटा के विपरीत माइक्रोसॉफ्ट.एक्सएमएमडीडी का उपयोग करूंगा। आपके पास प्रॉक्सी प्रकार और अनुरोध हैं जो आपको कोड को और अधिक क्लीनर लिखने की अनुमति देंगे। ओडाटा में अन्य सीमाएं हैं जो QueryExpressions/CRM LINQ/FetchXml में भी नहीं है।

ओडाटा जेएस कोड (यानी सीआरएम फॉर्म से अनुरोध) के लिए अधिक समझदारी करेगा। इस प्रकार

2

अपने BeforeRequest कार्रवाई में, Accept-Encoding शीर्ष लेख:

settings.BeforeRequest = (request) => 
{ 
    // ... other headers as above 
    request.Headers.Add("Accept-Encoding", "gzip"); 
}; 
संबंधित मुद्दे