2010-01-15 12 views
5

मैं एक डब्ल्यूसीएफ सेवा लिख ​​रहा हूं जिसके लिए बड़ी फ़ाइलों को स्थानांतरित करने की आवश्यकता है, इसलिए मैं स्ट्रीमिंग का उपयोग कर रहा हूं, लेकिन दूसरी तरफ मुझे उपयोगकर्ता नाम विशिष्ट प्रारंभिकरण करने की आवश्यकता है।क्या netTcp बाइंडिंग में दोनों सत्र और स्ट्रीमिंग को सक्षम करने का कोई तरीका है?

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

वहाँ एक रास्ता दोनों स्ट्रीमिंग और netTcpBinding में सत्र चालू करने के लिए है?

उत्तर

4

बड़े फ़ाइल स्थानांतरण वास्तव में WCF में एक समस्या है और स्ट्रीमिंग विकल्प कुछ भी समाधान नहीं करता है (आप भी सर्वर पर अधिक स्मृति की जरूरत है)।

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

[ServiceContract(CallbackContract = typeof(IClient), SessionMode = SessionMode.Required)] 
public interface IServer 
{ 
    [OperationContract] 
    FilePart GetFileChunk(string identifier, int number, int blockSize); 
} 

DataContract के रूप में आप कुछ इस तरह उपयोग कर सकते हैं:

[DataContract] 
public class FilePart 
{ 
    [DataMember] public int Part; 
    [DataMember] public byte[] Data; 
    [DataMember] public int BlockSize; 
} 

"सही" ब्लॉक आकार आप के लिए है पता करने के लिए

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

यह भी महत्वपूर्ण है कि maxReceivedMessageSize, maxBufferSize, और टाइमआउट पर्याप्त (बाध्यकारी विन्यास में) और पाठक कोटा पर्याप्त हैं। परीक्षण के लिए मैं सभी क्षेत्रों के लिए अधिकतम उपयोग करने की अनुशंसा करता हूं, जब यह उन मानों का उपयोग करता है जो बेहतर फिट बैठते हैं।

यदि आप डुप्लेक्स बाइंडिंग के साथ काम करते हैं तो आप वस्तुओं को रेफरी से पास कर सकते हैं। इस तरह के साथ आप, कॉलबैक वस्तुओं पारित कर सकते हैं ताकि आप बेहतर हस्तांतरण और इतने पर की प्रगति देखने में सक्षम हैं ...

[OperationContract IsOneWay=true] 
FilePart GetFileChunk(string identifier, int number, int blockSize, ref TransferState callback); 

मैं इस बारे में सोच सब चालें और संकेत मैं दे सकते हैं कर रहे हैं। मुझे उम्मीद है यह मदद करेगा।

+1

क्या आकार आप के रूप में "बड़ी" पर विचार करेंगे? – flayn

+0

यह इस बात पर निर्भर करता है कि आप क्या बनाना चाहते हैं ... सही कॉन्फ़िगरेशन के साथ आप फ़ाइल को विभाजित किए बिना 50 एमबी से ऊपर फ़ाइलों को स्थानांतरित कर सकते हैं, लेकिन आपको wcf स्ट्रीमिंग विकल्प को सक्रिय करना था। स्ट्रीमिंग विकल्प के साथ सर्वर पर मेमोरी खपत स्थानांतरण संदेश-आधारित फ़ाइल भाग से अधिक है, इसलिए यदि आपको उच्च लोड को संभालना है, तो विभाजन बेहतर तरीका हो सकता है ... – CaptainPlanet

1

मुझे नहीं लगता कि कि WCF बड़ी फ़ाइलों को स्थानांतरित करने के लिए उपयुक्त है - हालांकि WCF उन पर आधारित है System.Net.Sockets का उपयोग कर, आज़मा सकते हैं।

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

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