2012-10-11 31 views
11

मैं अपने डब्ल्यूपीएफ अनुप्रयोगों के साथ किसी समस्या के साथ कुछ दिनों तक संघर्ष कर रहा हूं और मुझे आश्चर्य है कि कोई इस से पहले आया है और मदद कर सकता है? समस्या उस वेब विधि कॉल में प्रकारों को संभालने के लिए "ऑन-द-फ्लाई" एक धारावाहिक उत्पन्न करने वाले क्लाइंट को उबालने लगती है। जब उस विधि को पहली बार बुलाया जाता है (वेब ​​सेवा पहले से ही चल रही है), तो यह उदाहरण ले सकता है 8 सेकंड, बाद की कॉल उदा। 20ms। क्लाइंट डब्ल्यूपीएफ प्रक्रिया पर सीपीयू इस देरी के दौरान उच्च है।WPF से डब्ल्यूसीएफ का उपयोग पहले उपयोग पर बहुत धीमी

XmlSerializer का उपयोग करते समय, svcutil का उपयोग करके इन धारावाहिक असेंबली को पूर्व-उत्पन्न करने का एक तरीका है। सामान्य डब्लूसीएफ डेटाकंट्रैक्ट सर्राइज़र का उपयोग करते समय (जैसा कि हम हैं), यह विकल्प मौजूद प्रतीत नहीं होता है।

मैं चाहते हैं क्या मेरे सभी डेटा के ठेके में सभी प्रकार के लिए इस विधानसभा (एक बहुत) प्री-उत्पन्न करने के लिए या वैकल्पिक रूप से, एक कस्टम एक है कि मैं कोड कर सकते हैं के साथ इस प्रक्रिया को बदलने के लिए सक्षम होने के लिए है और डेटा गुजरता बाइनरी में (हम इस webservice/क्लाइंट के दोनों सिरों के मालिक हैं और वे दोनों .NET 4 हैं)। मैंने पहले से ही बाइनरीफोरमेटर और जीजेप संपीड़न का उपयोग किया है और यह डेटा के हस्तांतरण को गति देता है, लेकिन यह हमेशा ढांचे द्वारा डी-सीरियलाइज्ड होने के लिए एक्सएमएल में बहाल हो जाता है, इसलिए यह समस्या बनी हुई है।

कोई भी विचार?

उत्तर

8

आप protobuf-net जैसे बाइनरी लाइब्रेरी का उपयोग कर सकते हैं, जो कि प्रारंभिक स्टार्टअप लागत है, भले ही प्रत्येक प्रकार के लिए कोड उत्पन्न किया जाए, फिर भी यह way better than DataContractSerializer or BinaryFormatter है। आपको कुछ सेकंड प्राप्त करना चाहिए और एक समग्र चिकना अनुभव होना चाहिए। यह easily integrated with WCF हो सकता है। ध्यान रखें कि डब्ल्यूसीएफ अभी भी सही डब्लूएसडीएल और विभिन्न मेटाडेटा उत्पन्न करने के लिए आपके विभिन्न अनुबंधों का निरीक्षण करेगा।

अन्य चीजें हैं जो डब्ल्यूसीएफ स्टार्टअप को धीमा कर सकती हैं, जैसे डिफ़ॉल्ट वेब प्रॉक्सी निर्धारित करना। सुनिश्चित करें कि useDefaultWebProxy आपके बाध्यकारी कॉन्फ़िगरेशन में false है यदि आपके पास इसका कोई उपयोग नहीं है।

फिर भी, आप पाएंगे कि WCF स्टार्टअप आमतौर पर धीमा है चाहे आप इसे अनुकूलित करने के लिए क्या करें। व्यक्तिगत रूप से, इसी तरह के परिदृश्य में धीमेपन से लड़ने से थक गए (मैंने दोनों सिरों को नियंत्रित किया, और ग्राहक एक डब्ल्यूपीएफ एप्लीकेशन था), मैंने बस डब्ल्यूसीएफ को हटा दिया और ServiceStack + प्रोटोबफ-नेट के लिए चला गया। पहली कॉल 2-3 सेकंड से ~ 100ms तक चली गई, और बाद में सभी HTTP कॉल वास्तव में तात्कालिक हैं। कुल उपयोगकर्ता अनुभव में काफी सुधार हुआ है। ध्यान दें कि मैं सर्विसस्टैक से संबद्ध नहीं हूं, यह सिर्फ मेरा अनुभव है।

+0

धन्यवाद जुलिएन, मैं useDefaultWebProxy झूठी पहले से ही मिला है। मैंने प्रोटोबफ-नेट का उपयोग करने के लिए देखा है, लेकिन मुझे गीले समझने में परेशानी हो रही है, मुझे एक नई विशेषता के साथ अपने सभी डेटा प्रकारों को दोबारा सजाने की आवश्यकता होगी - मुझे उम्मीद नहीं है। यह वेब साइट पर कहता है कि v2 "यदि आप चाहें तो विशेषताओं के बिना उपयोग किया जा सकता है", लेकिन सभी उदाहरण विशेषताओं का उपयोग करते हैं। क्या यह पहली कॉल की स्टार्टअप गति में सुधार करेगा, यहां तक ​​कि आईआईएस (जो वास्तव में अनिवार्य है) में, यानी प्रोटोबफ-नेट सीरिएलाइज़र बिल्ड समय पर प्री-जेनरेट किया गया है? –

+0

@ सिमोन इवान्स, जब तक आपके पास प्रत्येक 'डेटामेम्बर' पर 'ऑर्डर' प्रॉपर्टी सेट हो, तब तक आपको ठीक होना चाहिए। हालांकि इसे खुद का उपयोग नहीं किया था (मैं शुरुआत से protobuf के साथ चला गया)। –

+0

जूलियन, क्या आपका मतलब है कि मुझे हर सार्वजनिक संपत्ति में [ProtoMember (n)] जोड़ना होगा? आपकी मदद के –

0

आप अपनी डब्ल्यूसीएफ सेवा को प्रीलोड करके ठंडा-प्रारंभ समय सुधार सकते हैं ... यानी। पहले अनुरोध के लिए लोड होने का इंतजार न करें ... अग्रिम लोड करें।

बस कुछ विचार ... जो मदद गति को क्रमबद्धता क्षेत्र में बातें "might"।

आपके सेवा प्रकारों के लिए धारावाहिक असेंबली की पूर्व-पीढ़ी के संबंध में .... परियोजना में विकल्प है जिसे "सीरियलाइजेशन असेंबली जेनरेट करें" कहा जाता है .... अगर "चालू" स्विच किया जाता है तो यह असेंबली उत्पन्न करता है रन टाइम पर गतिशील रूप से बजाए समय बनाएं।

यह स्पष्ट नहीं है, तो इस विकल्प, केवल XmlSerializer आधारित serializers के लिए क्रमबद्धता विधानसभाओं के पूर्व पीढ़ी के लिए है या DataContractSerializers के लिए भी।आप इसे "चालू" पर स्विच करने का प्रयास कर सकते हैं यह देखने के लिए कि क्या इससे कोई फर्क पड़ता है।

तुम भी DataContract serializers व्यायाम करने के लिए ... यानी अपने क्लाइंट और सर्वर में कोड में जल्दी पर यह करने के लिए, की कोशिश कर सकते। ग्राहक या सर्वर से अनुरोध करने से पहले ... (सुनिश्चित नहीं है कि यह मदद करेगा या नहीं)।

DataContractSerializer ps = new DataContractSerializer(typeof(Person)); 
DataContractSerializer cs = new DataContractSerializer(typeof(Company)); 
etc... 

इसे और अधिक पोषणीय आप एक नियमित प्रकार है कि आप को क्रमानुसार करने जैसे इरादा पता लगाने के लिए प्रतिबिंब का उपयोग करता है लिख सकता है बनाने के लिए DataContract .... या कुछ अन्य heuritistics .... या एक पूर्वनिर्धारित तालिका के साथ चिह्नित प्रकारों के लिए देखो। आप उत्पन्न सेवा संदर्भ को देखकर पुष्टि करते हैं कि DataContractSerializer वास्तव में किया जा रहा है

+1

धन्यवाद कॉलिन, मैंने उपर्युक्त सभी की कोशिश की है और इनमें से कोई भी कोई फर्क नहीं पड़ता है। आखिरी सुझाव के साथ समस्या यह है कि जिस मुद्दे से मैं निपटने की कोशिश कर रहा हूं वह क्लाइंट की धीमी स्टार्टअप है, इसलिए इससे कोई फर्क नहीं पड़ता कि मैं धारावाहिकों के लिए स्टार्टअप करता हूं या यदि ढांचा ऐसा करता है, तो यह एक ही समय लेगा । सबसे ठंडा प्रारंभ फिक्स सर्वर-साइड से संबंधित है, जो कोई समस्या नहीं है। "जेनरेट सीरियलाइजेशन असेंबली" विकल्प केवल एक्सएमएलसेरियलज़र के लिए काम करता है और फिर तभी वीएस को प्रॉक्सी मिलती है (हमारे पास अपना स्वयं का होता है)। –

+0

यह लिंक आपको विभिन्न रणनीतियों लेने के लिए की कुछ विचार दे सकता है .... http://www.icodeteam.net/default/post/iCodeTeam/35/Object-Serialization-in-NET-Available-serialization-libraries/ –

2

किया? यह संभव है कि अतिरिक्त सेवा संदर्भ ऑपरेशन के दौरान कुछ स्कीमा विसंगति के कारण, डिफ़ॉल्ट DataContractSerializer के बजाय XmlSerializer कोड जेनरेट किया गया था जो इस व्यवहार को XmlSerializer के विशिष्ट बना रहा है। इस मामले में, जैसा कि आपने नोट किया है - आप शीत-स्टार्टअप को बेहतर बनाने के लिए क्रमबद्धरण कोड को पूर्व-जनरेट कर सकते हैं: http://msdn.microsoft.com/en-us/library/aa751883.aspx। धन्यवाद।