2008-11-11 2 views
10

मैं एक ऐप को पुन: डिज़ाइन कर रहा हूं जिसे मैंने विरासत में दिया है जो एक लैपटॉप से ​​डिजिटल सर्वर को डिजिटल सर्वर भेजता है। विचार "फ़ील्ड पर बाहर" तस्वीरें लेना है और उन्हें तुरंत एक वेब पेज पर प्रकाशित करना है (कुछ और फैंसी फीचर्स के साथ)।एक अविश्वसनीय (3 जी) नेटवर्क कनेक्शन पर डेटा भेजने के लिए उपयोग करने के लिए .NET में सबसे अच्छा डिज़ाइन क्या है?

विशिष्ट परिदृश्य
1. मानक यूएसबी का उपयोग कर कैमरे से लैपटॉप में स्थानांतरित कर दिए जाते हैं।
2. फोटो विभिन्न तरीकों से संसाधित किए जाते हैं। (महत्वपूर्ण नहीं)
3. प्रत्येक फोटो को एक छोटे से टुकड़ों (~ 64 केबी प्रत्येक) में एक मानक अपाचे वेब सर्वर पर वेबरेक्वेस्ट का उपयोग करके पोस्ट किया जाता है जहां इसे दोबारा विलय कर दिया जाता है।

वर्तमान डिज़ाइन के साथ समस्या यह है कि नेटवर्क कनेक्शन अविश्वसनीय होने पर यह अक्सर लटकता है। चूंकि हम एक मोबाइल नेटवर्क (3 जी) का उपयोग कर रहे हैं और अक्सर कवरेज से बाहर हो जाते हैं, मुझे इसे ठीक से संभालने का एक तरीका चाहिए।

मेरा सवाल यह है कि ऐसा करने के लिए एक बेहतर समाधान है कि जब कनेक्शन कनेक्शन हर समय गिरता है तो ऐप लटका नहीं देगा।

(बोनस सवाल यह है कि इस ठीक से लैपटॉप के साथ बढ़ोतरी निकाले बिना परीक्षण किया इकाई हो सकता है।)

संपादित 2008-11-24: मैं अब एक उचित परीक्षण वातावरण स्थापित करने के लिए प्रबंधित किया है इसके लिए NetLimiter और TMnetsim (फ्रीवेयर) के संयोजन का उपयोग कर। मैंने 5 केबी/सेकंड सेट करने और सभी पैकेटों में से 1% ड्रॉप करने का प्रयास किया - मेरा ऐप अभी भी नए डिज़ाइन के साथ अच्छा काम करता है।

संपादित करें 2008-12-11: बस यह अपडेट करने के लिए कि मैंने यह कैसे किया। मैंने एक पृष्ठभूमि कार्यकर्ता बनाया है (जैसा कि नीचे सुझाया गया है) जब भी कैमरे से पीसी में तस्वीरों की प्रतिलिपि बनाने के लिए कैमरे का पता लगाया जाता है। फिर एक और पृष्ठभूमि कार्यकर्ता जब मैंने पीसी पर फ़ाइलों को एसिंक्रोनस HTTP ट्रांसफर का उपयोग करके अपलोड करने के लिए शुरू किया। यह सब कुछ ठीक करने के लिए दर्द था, खासकर जब से ऑपरेशन किसी भी समय "रद्द करने योग्य" होना चाहिए ... लेकिन किसी भी तरह, अब यह काम करता है। मेरी मदद करने वाले हर किसी के लिए एक बड़ा धन्यवाद!

उत्तर

2

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

आपकी सर्वश्रेष्ठ शर्त कुछ प्रकार की पृष्ठभूमि कार्यकर्ता प्रक्रिया तैयार करेगी जो डिवाइस पर एक ड्रॉपबॉक्स निर्देशिका में सहेजी जाने के बाद फ़ोटो अपलोड करेगी। मैं कहूंगा कि एक .NET आधारित पृष्ठभूमि प्रक्रिया बनाना मामूली नहीं है।

1

पहले कारण है कि यह फांसी रहा है यह पता लगाने - अनुरोध सिर्फ वहाँ बैठे हैं? क्या वे समय निकालते हैं? यदि आप टाइमआउट सेटिंग को कम करते हैं तो क्या होता है?

क्या आप यूआई थ्रेड से POST कर रहे हैं? (कि :)

आप संभवतः बहुत ही कम समय समाप्ति के साथ दिल की धड़कन अनुरोध करके कनेक्शन छोड़ने भी पता लगा सकता है मत करो।

+0

ऐसा लगता है जैसे मैं कुछ डेटा भेजता हूं और डेटा "रास्ते में" होने पर कनेक्शन ड्रॉप हो जाता है, डेटा खो जाता है और अपलोड थ्रेड लटकता है। मैं वास्तव में गन्दा कोड स्थिर करने की कोशिश करने के बजाय पूरे अपलोड को फिर से डिजाइन करना पसंद करूंगा। – Christopher

+0

यदि आप एक टाइमआउट सेट करते हैं, तो क्या वह सम्मानित है? यह मेरा पहला बंदरगाह होगा। –

0

सबसे पहले, मैं आवेदन के बाहर स्थानांतरण प्रक्रिया डाल दूंगा। फ़ाइलों को एक उपयोगिता के साथ सिंक करें जो इसे अंतिम स्थानांतरण के बीच से स्थानांतरण को पुनरारंभ करने की अनुमति देता है।

आप संचार अनुकरण कर सकते हैं Faraday cage के कुछ प्रकार के साथ चला जाता है।

0

क्या आपने Sync Framework पर देखा है?

आशा है कि यह मदद करता है, ब्रूनो Figueiredo

+0

यह दिलचस्प है। मुझे शायद अपने स्वयं के प्रदाता को विकसित करने की आवश्यकता होगी; यह दूसरे छोर में अपाचे/PHP से कुछ और उपयोग करने का विकल्प नहीं है। – Christopher

1

आप शायद, WebRequest.GetResponse के बजाय WebRequest.BeginGetResponse उपयोग करने की आवश्यकता है, यद्यपि वहाँ तो (शायद WebRequest के निपटान में मदद मिलेगी प्रतिक्रिया रद्द करने के लिए एक तरीका हो प्रतीत नहीं होता है)।

इसके अलावा

, आप क्षेत्रों में अपने लैपटॉप को बाहर निकाले बिना इस परीक्षण करने के लिए WebRequest

+0

क्या असीमित रूप से अपलोड करना वाकई सबसे अच्छा है? मेरे पास यह एक अलग धागे में है, और ऐसा लगता है कि कोड को एसिंक्रोनस कॉल करने के लिए और भी जटिल बनाना है। मैं निश्चित रूप से यहां गलत हो सकता है। – Christopher

+0

यदि आपके पास नेटवर्क समस्याएं हैं तो मैं एसिंक्रोनस कॉल का प्रयास नहीं करूंगा। आपको निश्चित रूप से "मौलिक रूप से जुड़े" स्थानांतरण मॉडल की आवश्यकता होती है। – D3vtr0n

1

एक तरह की Timeout संपत्ति के साथ खेल की कोशिश कर सकते: एक अतिरिक्त मशीन पर m0n0wall प्रयास करें, और निचोड़ करने के लिए अपने फ़ायरवॉल नियम सेट बैंडविड्थ और ड्रॉप पैकेट।

वैकल्पिक रूप से, अपने सर्वर/ग्राहक

+0

दोनों वास्तव में महान विचार हैं, धन्यवाद! – Christopher

0

मैं डेटा हस्तांतरण के लिए एडीओ.NET सिंक सेवाओं के साथ एएसपी.NET कैशिंग तकनीकों का उपयोग करने का प्रयास करूंगा।

अपनी छवियों को पहले बाइनरी या बीएलओबी प्रारूप में कैश करने और उन्हें स्थानीय सीई डेटाबेस (या एक्सप्रेस) में संग्रहीत करने का प्रयास करें। फिर वेब सर्विसेज के माध्यम से डेटा को केंद्रीय सर्वर डेटाबेस में सिंक करें।

अपने कैश किए गए छवि स्थानान्तरण को संभालने के लिए एक केंद्रीकृत वेब सेवा बनाने का प्रयास करें।

वेब सेवा "मौलिक रूप से जुड़े" परिदृश्य में सिंक सेवाओं के माध्यम से डेटा प्राप्त करेगी।

इकाई परीक्षण के लिए, एक वर्चुअल मशीन (वीएमवेयर) या एक डायलअप कनेक्शन पर एक लैपटॉप का उपयोग करने का प्रयास करें।