बड़े फ़ाइल स्थानांतरण वास्तव में 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);
मैं इस बारे में सोच सब चालें और संकेत मैं दे सकते हैं कर रहे हैं। मुझे उम्मीद है यह मदद करेगा।
क्या आकार आप के रूप में "बड़ी" पर विचार करेंगे? – flayn
यह इस बात पर निर्भर करता है कि आप क्या बनाना चाहते हैं ... सही कॉन्फ़िगरेशन के साथ आप फ़ाइल को विभाजित किए बिना 50 एमबी से ऊपर फ़ाइलों को स्थानांतरित कर सकते हैं, लेकिन आपको wcf स्ट्रीमिंग विकल्प को सक्रिय करना था। स्ट्रीमिंग विकल्प के साथ सर्वर पर मेमोरी खपत स्थानांतरण संदेश-आधारित फ़ाइल भाग से अधिक है, इसलिए यदि आपको उच्च लोड को संभालना है, तो विभाजन बेहतर तरीका हो सकता है ... – CaptainPlanet