c# बड़े बाइनरी(बाइट[]) डब्ल्यूसीएफ के माध्यम से फ़ाइल स्थानांतरण




.net asp.net (4)

क्या आपने स्ट्रीमिंग ट्रांसफर का उपयोग करने पर एक नज़र डाली है?

विंडोज कम्युनिकेशन फाउंडेशन (डब्ल्यूसीएफ) या तो buffered या स्ट्रीम किए गए स्थानान्तरण का उपयोग कर संदेश भेज सकते हैं। डिफॉल्ट buffered-transfer मोड में, एक रिसीवर इसे पढ़ने से पहले एक संदेश पूरी तरह से वितरित किया जाना चाहिए। ट्रांसफर मोड स्ट्रीमिंग में, रिसीवर पूरी तरह से वितरित होने से पहले संदेश को संसाधित करना शुरू कर सकता है। स्ट्रीमिंग मोड तब उपयोगी होता है जब पारित की गई जानकारी लंबी होती है और इसे क्रमशः संसाधित किया जा सकता है। स्ट्रीमिंग मोड भी उपयोगी होता है जब संदेश पूरी तरह से buffered होने के लिए बहुत बड़ा है।

http://msdn.microsoft.com/en-us/library/ms789010.aspx

मैं एक डब्ल्यूसीएफ सेवा बनाने की कोशिश कर रहा हूं जो मुझे ग्राहकों से सेवा में बड़ी बाइनरी फाइलें भेजने की अनुमति देता है।

हालांकि मैं केवल 3-4 एमबी तक फ़ाइलों को सफलतापूर्वक स्थानांतरित करने में सक्षम हूं। (मैं विफल रहता हूं जब मैं 4.9 1 एमबी स्थानांतरित करने की कोशिश करता हूं और, बेशक, कुछ भी परे)

अगर मैं 4.9 1 एमबी फाइल भेजने की कोशिश करता हूं तो मुझे त्रुटि मिलती है:

अपवाद संदेश: http://localhost:56198/Service.svc HTTP प्रतिक्रिया प्राप्त करते समय एक त्रुटि हुई। यह HTTP प्रोटोकॉल का उपयोग न करने वाले सेवा एंडपॉइंट बाध्यकारी के कारण हो सकता है। यह सर्वर द्वारा निरस्त HTTP अनुरोध संदर्भ के कारण भी हो सकता है (संभवतः सेवा बंद होने के कारण)। अधिक जानकारी के लिए सर्वर लॉग देखें।

आंतरिक अपवाद संदेश: अंतर्निहित कनेक्शन बंद था: प्राप्त होने पर एक अनपेक्षित त्रुटि हुई।

आंतरिक अपवाद संदेश: परिवहन कनेक्शन से डेटा पढ़ने में असमर्थ : रिमोट होस्ट द्वारा एक मौजूदा कनेक्शन जबरन बंद कर दिया गया था।

आंतरिक अपवाद संदेश: रिमोट होस्ट द्वारा एक मौजूदा कनेक्शन जबरन बंद कर दिया गया था

यह त्रुटि ग्राहक पक्ष पर होती है जैसे ही बाइट [] फ़ाइल को उजागर सेवा विधि में विधि पैरामीटर के रूप में भेजा जाता है।

सफल फ़ाइल स्थानान्तरण (3 एमबी से नीचे) के मामले में ब्रेक पॉइंट हिट होने पर फ़ाइल को स्थानांतरित करने के बाद सेवा विधि की पहली पंक्ति पर ब्रेकपॉइंट होता है और फ़ाइल स्थानांतरित हो जाती है। हालांकि इस मामले में जैसे ही विधि कहा जाता है, त्रुटि आती है। इस त्रुटि के मामले में सेवा में ब्रेकपॉइंट हिट नहीं होता है।

मैं अपने सेवा वेब.कॉन्फिग और एएसपी पेज (क्लाइंट) Web.config के अपने अनुभाग पेस्ट करने जा रहा हूं। अगर आपको फ़ाइल भेजने और फ़ाइल स्वीकार करने वाले कोड की भी आवश्यकता है, तो मुझे बताएं, मैं इसे भी भेजूंगा।

सेवा वेब। कॉन्फिग

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="basicHttpEndpointBinding" closeTimeout="01:01:00"
      openTimeout="01:01:00" receiveTimeout="01:10:00" sendTimeout="01:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646"
      messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedRequest"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646"
        maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>        
  </basicHttpBinding>      
</bindings>
    <services>
        <service behaviorConfiguration="DragDrop.Service.ServiceBehavior" name="DragDrop.Service.Service">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpEndpointBinding" contract="DragDrop.Service.IService">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="DragDrop.Service.ServiceBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

क्लाइंट (एएसपीनेट पेज) वेब। कॉनफिग

<system.serviceModel>
<bindings>
   <basicHttpBinding>
      <binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646"
         messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedResponse"
         useDefaultWebProxy="true">
         <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646"
            maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" />
         <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
               realm="">
               <extendedProtectionPolicy policyEnforcement="Never" />
            </transport>
            <message clientCredentialType="UserName" algorithmSuite="Default" />
         </security>
      </binding>
   </basicHttpBinding>
</bindings>

<behaviors>
  <endpointBehaviors>
    <behavior name="debuggingBehaviour">
      <dataContractSerializer maxItemsInObjectGraph="2147483646" />
    </behavior>
  </endpointBehaviors>
</behaviors>

<client>
   <endpoint address="http://localhost:56198/Service.svc" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference.IService"
      name="BasicHttpBinding_IService" behaviorConfiguration="debuggingBehaviour" />
</client>
</system.serviceModel>

(हालांकि मैं मानता हूं कि स्ट्रीमिंग स्थानांतरण प्राथमिक होगा, नीचे दिए गए किसी भी अन्य बदलाव के बिना इसे काम करना चाहिए)

आपको Web.config में अधिकतम संदेश लंबाई बढ़ाने की भी आवश्यकता है:

<configuration>
  <system.web>
  <httpRuntime maxMessageLength="409600"
    executionTimeoutInSeconds="300"/>
  </system.web>
</configuration>

यह अधिकतम संदेश लंबाई 400 एमबी (पैरामीटर केबी में है) सेट करेगा। अधिक जानकारी के लिए इस एमएसडीएन पेज को देखें।


मैं दूसरों ने जो कहा है उसे प्रतिबिंबित करूंगा और कहूंगा कि एक स्ट्रीमिंग ट्रांसफर का उपयोग करना विंडोज संचार फाउंडेशन का उपयोग करते समय जाने का तरीका है। नीचे एक उत्कृष्ट गाइड है जो डब्ल्यूसीएफ पर फ़ाइलों को स्ट्रीम करने के लिए सभी चरणों को बताता है। यह काफी व्यापक और बहुत जानकारीपूर्ण है।

यहां यह है: डब्ल्यूसीएफ पर स्ट्रीमिंग फाइलों पर गाइड


जैसा कि बताया गया है, स्ट्रीमिंग ट्रांसफर का उपयोग करने का प्रयास करें, यहां कुछ उदाहरण कोड है जो स्ट्रीमिंग ट्रांसफर का उपयोग करके डेटा भेजने और प्राप्त करने (संभवतः) बड़ी मात्रा में डेटा दिखा रहा है।

इस तरह बाध्यकारी का उपयोग करें, MaxReceivedMessageSize और TranferMode सेटिंग्स को नोटिस करें।

<binding name="Streaming_Binding" maxReceivedMessageSize="67108864"  
    messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed">
</binding>

कुछ सेवा कोड जोड़ें:

[OperationContract]
public Stream GetLargeFile()
{
    return new FileStream(path, FileMode.Open, FileAccess.Read);
}

[OperationContract]
public void SendLargeFile(Stream stream)
{
    // Handle stream here - e.g. save to disk    
    ProcessTheStream(stream);

    // Close the stream when done processing it
    stream.Close();
}

और कुछ ग्राहक कोड :

public Stream GetLargeFile()
{
    var client = /* create proxy here */;
    try
    {
        var response = client.GetLargeFile();

        // All communication is now handled by the stream, 
        // thus we can close the proxy at this point
        client.Close();

        return response;
    }
    catch (Exception)
    {
        client.Abort();
        throw;
    }
}

public void SendLargeFile(string path)
{
    var client = /* create proxy here */;
    client.SendLargeFile(new FileStream(path, FileMode.Open, FileAccess.Read));
}

साथ ही, सुनिश्चित करें कि आपको टाइमआउट नहीं मिल रहा है, एक बड़ी फ़ाइल में स्थानांतरण करने में कुछ समय लग सकता है (डिफ़ॉल्ट प्राप्त टाइमटाइम हालांकि 10 मिनट है)।

आप यहां माइक्रोसॉफ्ट डब्ल्यूसीएफ / डब्ल्यूएफ नमूना कोड डाउनलोड कर सकते here (शीर्ष सी # लिंक लेखन के समय टूट गया है लेकिन अन्य नमूने कोड ठीक लगता है)।