2009-12-20 19 views
13

मैं एक परियोजना के लिए डब्ल्यूसीएफ का उपयोग करने के लिए देख रहा हूं जिसके लिए लोगों को मेरे सर्वर पर बड़ी फाइलें (64 एमबी -1 जीबी) अपलोड करने की क्षमता की आवश्यकता होगी। अपलोड को फिर से शुरू करने की क्षमता के साथ, मैं इसे डब्ल्यूसीएफ के साथ कैसे संभालेंगे।डब्ल्यूसीएफ के माध्यम से बड़ी फ़ाइल अपलोड कैसे संभालें?

एक बड़े ग्राहक आधार को संभालने के लिए, मैं डब्ल्यूसीएफ के माध्यम से जेएसओएन का परीक्षण करना चाहता था। यह फाइल अपलोड को कैसे प्रभावित करेगा? क्या यह JSON से किया जा सकता है, या क्या उन्हें अपलोड हिस्से के लिए आरईएसटी पर स्विच करने की आवश्यकता होगी?

उत्तर

15

यदि आप बड़ी फाइलें अपलोड करना चाहते हैं, तो आपको निश्चित रूप से WCF Streaming Mode पर देखना होगा।

असल में, आप अपने बाध्यकारी पर स्थानांतरण मोड बदल सकते हैं; डिफ़ॉल्ट रूप से, यह buffered है, यानी पूरे संदेश प्रेषक, serialized पर buffered की जरूरत है, और फिर पूरी तरह से प्रसारित किया जाना चाहिए।

स्ट्रीमिंग के साथ, आप या तो एक तरफा स्ट्रीमिंग (केवल अपलोड के लिए, केवल डाउनलोड के लिए) या बिडरेक्शनल स्ट्रीमिंग को परिभाषित कर सकते हैं। यह आपके बाध्यकारी के स्थानांतरण मोड को StreamedRequest, StreamedResponse, या केवल सादे Streamed पर सेट करके किया जाता है।

<bindings> 
    <basicHttpBinding> 
     <binding name="HttpStreaming" 
       maxReceivedMessageSize="2000000" 
       transferMode="StreamedRequest"/> 
    </basicHttpBinding> 
</bindings> 

तो फिर तुम एक सेवा अनुबंध जो किसी भी प्रकार Stream (अपलोड करने के लिए) के एक पैरामीटर प्राप्त करता है, या प्रकार Stream (डाउनलोड के लिए) के एक मान देता है की आवश्यकता है।

[ServiceContract] 
public interface IFileUpload 
{ 
    [OperationContract] 
    bool UploadFile(Stream stream); 
} 

ऐसा करना चाहिए!

+0

क्या होगा यदि आपका अनुरोध/प्रतिक्रिया किसी विशिष्ट स्कीमा का पालन करे? हां, अगर अनुरोध एक विशिष्ट वस्तु होना चाहिए, और आपके wsdl को इसे प्रतिबिंबित करने की आवश्यकता है? स्ट्रीम के साथ आप इसे कैसे लागू करेंगे? – Jeremy

+0

@ जेरेमी: जैसा कि मेरी प्रतिक्रिया कहती है: यदि आप स्ट्रीम किए गए स्थानांतरण का उपयोग करना चाहते हैं, तो आप ** केवल ** स्ट्रीम के प्रकार के एक पैरामीटर का उपयोग कर सकते हैं (या प्रकार 'स्ट्रीम' का वापसी मूल्य)। यदि आप अपनी सेवा को इस तरह डिज़ाइन नहीं कर सकते हैं और अन्य विशिष्ट आवश्यकताओं का पालन करना चाहते हैं, तो आप दुर्भाग्य से स्ट्रीमिंग स्थानांतरण का उपयोग नहीं कर सकते हैं। इस काम को करने के लिए कोई * जादू * तरीका नहीं है। –

+0

@marc_s एक बड़े स्ट्रिंग पैरामीटर के बारे में कैसे? [मेरा हालिया प्रश्न] (https://stackoverflow.com/questions/48774474/parameter-size-limit-for-strings#comment84577011_48774474) को इसके डुप्लिकेट के रूप में चिह्नित किया गया था, लेकिन मैं उचित पैरामीटर पास 1.2 जीबी 'बाइट सेट करने के साथ कर सकता हूं [] 'बिना किसी समस्या के विधि के पैरामीटर लेकिन यदि आप पैरामीटर प्रकार को 'बाइट []' से' स्ट्रिंग 'में बदलते हैं तो यह लगभग 28 एमबी तक सीमित है। मेरे पास पैरामीटर के रूप में 'स्ट्रिंग' होना चाहिए। – Franck

0

आप बड़ी फ़ाइल अप/डाउनलोड के लिए ट्रांसफरमोड स्ट्रीम किए गए और एक स्ट्रीम पैरामीटर या स्ट्रीम प्रतिक्रिया (उपयुक्त के रूप में) के साथ webHttp बाइंडिंग का उपयोग कर सकते हैं, लेकिन आपको URL और/या हेडर के माध्यम से कोई अनुरोध मेटाडेटा भेजना होगा, जब तक कि आप ' स्ट्रीम पर अपनी खुद की फ़्रेमिंग तैयार करने जा रहे हैं। आपको एक कस्टम गैर-एचटीएमएल क्लाइंट (जैसे सिल्वरलाइट, फ्लैश, इत्यादि) बनाना होगा, हालांकि ब्राउज़र स्थानीय फाइलों में यादृच्छिक पहुंच का समर्थन नहीं करते हैं, और सामान्य फ़ाइल अपलोड एक फॉर्म पोस्ट होगा, जेएसओएन नहीं।

1

MTOM बड़े बाइनरी डेटा को संभालने के लिए अनुकूलित किया गया है।

+1

अकेले एमटीओएम वास्तव में बहुत मदद नहीं करता है - आपको अभी भी पूरे संदेश को प्रसारित करने के लिए बफर में इकट्ठा करने की आवश्यकता है। –

संबंधित मुद्दे