2008-09-25 14 views
6

मेरे पास एक एएसपी.नेट वेब सेवा है जो कुछ भारी उठाने, जैसे कुछ फाइल ऑपरेशंस, या क्रिस्टल रिपोर्ट के समूह से एक्सेल शीट उत्पन्न करती है। मैं इस वेब सेवा को कॉल करके अवरुद्ध नहीं करना चाहता हूं, इसलिए मैं वेब सेवा कॉल को एसिंक्रोनस बनाना चाहता हूं। साथ ही, मैं इस वेब सेवा को वेब पेज से कॉल करना चाहता हूं, और कुछ तंत्र चाहता हूं जो मुझे सर्वर को मतदान जारी रखने की अनुमति दे ताकि मैं स्क्रीन पर प्रगति के कुछ संकेतक दिखा सकूं, जैसे कि फाइलों की संख्या संसाधित किया गया है। कृपया ध्यान दें कि मैं वेब विधि कॉल के पूरा होने पर अधिसूचना नहीं चाहता हूं, बल्कि, मुझे लाइव प्रगति की स्थिति चाहिए। मैं इसकी शुरुआत कैसे करूं?आप वेब सेवा कॉल की प्रगति को कैसे मापते हैं?

+1

और हम सब सोच रहे हैं, "क्यों वेब सेवा स्वचालित रूप से ऐसा नहीं है?" और जब हम कहते हैं कि वे चूसते हैं तो इसका मतलब क्या है। आपको इन सभी चीजों को अपने आप बनाना होगा। –

उत्तर

4

सर्वर पर एक अलग विधि लिखें जिसे आप निर्धारित नौकरी की आईडी पास करके क्वेरी कर सकते हैं और जो 0-100 (या 0.0 और 1.0, या जो भी हो) के बीच अनुमानित मूल्य देता है, इसके साथ कितना दूर है है।

उदा। रीस्ट-स्टाइल में, आप http://yourserver.com/app/jobstatus/4133/ पर एक GET अनुरोध कर सकते हैं जो text/plain के रूप में एक साधारण '52' वापस कर देगा। तो आपको बस यह पूछना होगा कि प्रत्येक (दूसरा? दो सेकंड? दस सेकंड?) यह देखने के लिए कि यह कितना दूर है।

आप वास्तव में बैकएंड पर निगरानी को कैसे पूरा करते हैं, इस पर निर्भर करता है कि आपकी प्रक्रिया क्या है और यह कैसे काम करती है।

1

आरंभिक "प्रारंभ रिपोर्ट पीढ़ी" वेब सेवा कॉल कुछ कार्य पूल में एक कार्य बनाते हैं, और कॉलर को कार्य की आईडी वापस लौटाते हैं।

फिर, एक और तरीका प्रदान करें जो किसी दिए गए कार्य के लिए "प्रतिशत पूर्ण" देता है।

एक तीसरी विधि प्रदान करें जो एक पूर्ण कार्य के लिए वास्तविक परिणाम देता है।

1

वेब सेवा कॉल की प्रगति के साथ डेटाबेस पर एक फ़ील्ड अपडेट करने का सबसे आसान तरीका होगा, और फिर उस वेब सेवा को बनाएं जो उस क्षेत्र से पूछताछ करे और मूल्य लौटाए।

+0

यदि आप डेटाबेस का उपयोग करते हैं, तो इन-मेमोरी टेबल बनाने का अच्छा विचार है। मामूली कार्यों पर डिस्क I/O बर्बाद करने का कोई मतलब नहीं है। –

+0

इसे तुच्छ नहीं होना चाहिए, आप इसे ऑडिटिंग/लॉग टेबल के रूप में उपयोग कर सकते हैं। तालिका पर एक कॉलम स्टोर या स्थिति स्टोर कर सकता है, अन्य स्टार्ट/एंड टाइम्स, कॉलर आईडी, और परिणाम मूल्य (असफल/सफल आदि) स्टोर कर सकते हैं। – ilitirit

0

कुछ प्रकार की कार्य आईडी या सत्र आईडी वापस करने के लिए वेब सेवा बनाएं। एक और वेब विधि है कि आईडी है, जो जानकारी की जरूरत रिटर्न (फ़ाइलों का%, सूची, जो कुछ भी) के साथ क्वेरी करने के लिए सुनिश्चित करें। इस विधि को क्लाइंट से कुछ अंतराल पर मतदान करें।

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

संपादित करें: मैंने अभी एक और समान जवाब देखा है, और टिप्पणी करें। टिप्पणीकर्ता सही है - आप डिस्क ऑपरेशंस से बचने के लिए इन-मेमोरी टेबल का उपयोग कर सकते हैं, लेकिन फिर भी एक अलग डीबी सर्वर का उपयोग कर सकते हैं।

2

मुझे लगता है कि एक्सएमएल वेब सेवा धीमी है, तो कई तरीके और मतदान प्रगति बेहद धीमी गति से हो जाएगा और सर्वर पर बहुत बड़ा भार उत्पन्न होगा निर्माण। मैं इसे उत्पादन वातावरण में नहीं करूँगा। मैं डेटाबेस मतदान के साथ एक ही (लेकिन छोटी) समस्याओं को देखता हूं।

एसओएपी एक्सटेंशन को आजमाएं। यह एक घटना संचालित मॉडल लागू करता है। Adding a Progress Bar to Your Web Service Client Application on MSDN देखें।

2

तुम भी use SoapExtensions डाउनलोड/प्रक्रिया प्रगति के अपने ग्राहक को सूचित कर सकते हैं। सर्वर क्लाइंट को ईवेंट भेज सकता है। यदि आप इसका उपयोग नहीं करते हैं तो ग्राहक में कुछ भी नहीं बदला जाना चाहिए।

अपने ग्राहक में कुछ इस तरह के लिए अनुमति देता है:

//... 
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService(); 
_myWebService.processDelegate += ProgressUpdate; 
_myWebService.CallHeavyMethod(); 
//... 

private void ProgressUpdate(object sender, ProgressEventArgs e) 
{ 
    double progress = ((double)e.ProcessedSize/(double)e.TotalSize) * 100.00; 
    //Show Progress... 
} 
संबंधित मुद्दे