यह एक समस्या है जिसे मैं पिछले सप्ताह में जांच कर रहा हूं और कोई समाधान नहीं मिल रहा है। उनसे मिली पोस्टें मिलीं लेकिन कभी जवाब नहीं मिला, उम्मीद है कि यह दूसरों की भी मदद करेगा।इसे पढ़ने के बिना डब्ल्यूसीएफ सेवा से स्ट्रीम को कैसे रोकें?
मेरे पास WCF
सेवा है जो किसी ऑब्जेक्ट को stream
के अंदर रखती है। मैं basicHttpBinding
का उपयोग स्ट्रीम किए गए स्थानांतरण और एमटीओएम को क्लाइंट को भेजने के लिए करता हूं।
ग्राहक WCF
सेवा पर कॉल करता है और प्रतिक्रिया ऑब्जेक्ट प्राप्त करने के तुरंत बाद प्रॉक्सी बंद कर देता है।
अगला, क्लाइंट WCF सेवा से प्राप्त स्ट्रीम को पढ़ता है और इसे स्थानीय डिस्क पर एक फ़ाइल में लिखता है। यह सब ठीक काम करता है।
मेरी समस्या तब होती है जब ग्राहक ऑपरेशन को रद्द करना चाहता है और डब्ल्यूसीएफ सेवा से डेटा डाउनलोड करना बंद कर देता है। यदि मैं स्ट्रीम पर .close()
पर कॉल करता हूं, उदाहरण: serverReply.DataStream.Close();
तो यह जारी रखने से पहले डब्लूसीएफ सेवा से पूरी स्ट्रीम को ब्लॉक और पढ़ता है। धारा काफी बड़ी हो सकती है और नेटवर्क हमेशा तेज़ नहीं होता है।
यह नेटवर्क संसाधन उपयोग दोनों के लिए बहुत अवांछनीय है, जो मूल रूप से उस डेटा पर बर्बाद हो जाता है जिसका अब उपयोग नहीं किया जाता है। और चूंकि basicHttpBinding
डब्ल्यूसीएफ सेवा सर्वर पर केवल दो समवर्ती टीसीपी कनेक्शन (डिफ़ॉल्ट रूप से) की अनुमति देता है, यह तब तक अन्य कनेक्शन प्रयासों को अवरुद्ध करता है जब तक स्ट्रीम को इसके अंत तक पढ़ा नहीं जाता है।
मैं समवर्ती कनेक्शन की संख्या में वृद्धि कर सकता हूं, लेकिन यह एक बुरा समाधान होगा क्योंकि यह परेशानी के लिए खुल जाएगा।
उदाहरण के लिए, 20 निरस्त डाउनलोड जो अभी भी इसे फेंकने के लिए डेटा डाउनलोड कर रहे हैं। मुझे ट्रांसफर स्टॉप पूरी तरह से करने की जरूरत है।
क्लाइंट पर, स्ट्रीम ऑब्जेक्ट केवल नियमित Stream
वर्ग है, इसलिए इसमें केवल बंद विधि है, और कुछ नहीं।
प्रॉक्सी ऑब्जेक्ट पर .close()
या .abort()
पर कॉल करने से मदद नहीं मिलती है, न ही .dispose()
या किसी अन्य विधि का उपयोग करके इसे नष्ट कर देता है। सर्वर की तरफ, मैं OperationContext.OperationCompleted
ईवेंट को संभालता हूं, लेकिन इसे तब तक नहीं निकाल दिया जाता है जब तक कि stream
के डेटा को अंत तक पढ़ा नहीं जाता है।
तो सवाल यह है कि, मैं पूरी तरह से इसे पढ़ने के बिना स्ट्रीम को बंद/निरस्त कैसे करूं?
इस के साथ कोई भाग्य? – Schultz9999
वास्तव में बड़ी फ़ाइलों को भेजने के दौरान एक ही समस्या का सामना करना पड़ रहा है ... ऐसा लगता है कि वास्तव में कुछ स्पष्ट होना चाहिए। शायद एक कामकाज के रूप में chunking लागू करने के लिए जा रहा हूँ। –