2009-12-03 3 views
6

कैसे सुनिश्चित करना है कि WCF ChannelFactory एक्सएमएल विन्यास में बाध्यकारी सेटिंग्स का उपयोग करता (MaxArrayLength नजरअंदाज कर दिया है)सुनिश्चित करने के लिए कैसे है कि WCF ChannelFactory एक्सएमएल विन्यास में बाध्यकारी सेटिंग्स का उपयोग करता (MaxArrayLength नजरअंदाज कर दिया है)

हाय, मैं WCF करने के लिए नया हूँ और और मेरी पहली डब्ल्यूसीएफ सेवा और ग्राहक लिखना। मैं विन्यास उत्पन्न करने के लिए उपकरण का उपयोग नहीं करना पसंद करता हूं; मैं खुद को कॉन्फ़िगरेशन लिखूंगा। समस्या मैं को हल करने के लिए कोशिश कर रहा हूं क्लाइंट का नेटटीसीपी पर एक सेवा के साथ संचार कर रहा है। सेवा संभावित रूप से बहुत बड़े पेलोड लौटा सकती है (डिफ़ॉल्ट readerQuotas.maxArrayLength की तुलना में महान)। बाइट स्ट्रीम पेलोड्स अपेक्षाकृत कम (यानी डिफ़ॉल्ट रूप से कम जो 165 के बारे में सोचता है) से कम होने वाले घटकों को शुरू में ठीक किया गया है। मैं एक बाध्यकारी और मैक्सएरेलेथेंथ को पर्याप्त रूप से बड़े मूल्य पर सेट करके प्रोग्रामिंगिक रूप से इस समस्या को हल कर सकता हूं। हालांकि, मुझे xml कॉन्फ़िगरेशन में समकक्ष प्रदर्शन करने में सक्षम होना चाहिए।

मेरे app.config (ग्राहक) है:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 

     <client> 
      <endpoint address="net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService/" 
       binding="netTcpBinding" bindingConfiguration="unsecureNetTcpBinding" 
       contract="WcfDataServiceLib.IRemoteDataRequester" 
       name="DataRequesterEndpoint" /> 
     </client> 

     <bindings> 
      <netTcpBinding> 
       <binding name="unsecureNetTcpBinding" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxArrayLength="1000000" /> 
        <security mode="None" /> 
       </binding> 
      </netTcpBinding> 
     </bindings> 

    </system.serviceModel> 
</configuration> 

कोड बनाने के लिए ग्राहक प्रॉक्सी इस प्रकार है:

private void Init() 
{ 
    var address = new EndpointAddress(@"net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService/"); 
    const string endpointName = "DataRequesterEndpoint"; 

    ChannelFactory<IRemoteDataRequester> factory = new ChannelFactory<IRemoteDataRequester>(
     endpointName); 

    IRemoteDataRequester proxy = factory.CreateChannel(address); 

    // call business methods on proxy ... 
} 

ध्यान दें कि कोड चर द्वारा config से जुड़ा हुआ है 'endpointName'।

सेवा पक्ष config (मुझे नहीं लगता कि यह प्रासंगिक है, लेकिन शामिल संपूर्णता के लिए):

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <services> 
      <service name="WcfDataServiceLib.RemoteDataRequesterService" behaviorConfiguration="WcfDataServiceLib.RemoteDataRequesterServiceBehavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress = "net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService" /> 
         <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfDataService/RemoteDataRequesterService/"/> 
        </baseAddresses> 
       </host> 
       <endpoint address ="" binding="netTcpBinding" bindingConfiguration="netTcpBindingConfig" contract="WcfDataServiceLib.IRemoteDataRequester"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 

      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfDataServiceLib.RemoteDataRequesterServiceBehavior"> 
        <serviceMetadata httpGetEnabled="False"/> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 

     <bindings> 
      <netTcpBinding> 
       <binding name="netTcpBindingConfig" receiveTimeout="00:00:30"> 
        <readerQuotas maxArrayLength="1000000"/> 
       </binding> 
       <binding name="netTcpReliableSession" receiveTimeout="00:00:30" > 
        <reliableSession enabled="true"/> 
       </binding> 
      </netTcpBinding> 
     </bindings> 

    </system.serviceModel> 
</configuration> 

जब मैं एक परिदृश्य में ग्राहक है, जिसमें एक बड़ी बाइट धारा सेवा के द्वारा दिया जाता है चलाने के लिए, एक अपवाद फेंक दिया गया है और अपवाद के अंदर संदेश है:

संचार त्रुटि आई: सॉकेट कनेक्शन निरस्त कर दिया गया था। यह आपके संदेश को संसाधित करने में त्रुटि या रिमोट होस्ट, या अंतर्निहित नेटवर्क संसाधन समस्या से अधिक टाइमआउट प्राप्त होने के कारण हो सकता है। 00: स्थानीय सॉकेट टाइमआउट '00 था ५९.९६,८७,४९४'

(यह एक टाइमआउट त्रुटि के रूप में तुरंत होता नहीं है।)

पहले कहा है, मैं प्रोग्राम के रूप में इस प्रकार है इसे ठीक कर सकते हैं:

var binding = new NetTcpBinding 
{ 
    ReaderQuotas = { MaxArrayLength = 10000000 } 
}; 

return new ChannelFactory<IRemoteDataRequester>(binding); 

यह ठीक काम करता है, लेकिन मुझे परीक्षण उद्देश्यों के लिए कॉन्फ़िगरेशन के माध्यम से ऐसा करने की आवश्यकता है।

var binding = new NetTcpBinding("unsecureNetTcpBinding"); 
return new ChannelFactory<IRemoteDataRequester>(binding); 

लेकिन यह कोई फर्क नहीं पड़ता:

मैं भी निम्नलिखित की कोशिश की है।

तो मेरा सवाल यह है कि, जब मैं एंडपॉइंट कॉन्फ़िगरेशन से चैनल बनाता हूं जिसमें मैक्सएरेलेथेंथ एक उपयुक्त मान पर सेट होता है, तो क्या यह मान अनदेखा किया जाता है?

बहुत से संबंध हैं।

ठीक है, मुझे समाधान मिला है। विन्यास सभी के साथ काम कर रहा था।हालांकि, मैंने जो कॉन्फ़िगरेशन प्रदान किया है ("unsecureNetTcp बाइंडिंग") जो मैंने http सेवाओं को चित्रित करने वाले कोड नमूने से पाया (नेट टीसीपी सेवा जो मैं डिजाइन कर रहा हूं)। कॉन्फ़िगरेशन का दुष्ट टुकड़ा 'सुरक्षा मोड = "कोई नहीं" जब मैंने इसे बाहर निकाला, तो यह काम किया। अगर मैं readerQuotas maxArrayLength बदलता हूं तो यह आवश्यक है जैसा कि मुझे आवश्यकता है। मेरा कोड क्यों काम करता है क्योंकि मैं सुरक्षा मोड को किसी के लिए सेट नहीं कर रहा था। आपकी टिप्पणियों और सहायता के लिए धन्यवाद।

उत्तर

1

मुझे लगता है कि समस्या यह हो सकती है कि कॉन्फ़िगर में आपके नंबर में केवल 6 शून्य हैं, जबकि कोड में आपके पास 7 शून्य हैं। शायद?

0

शायद MaxArrayLength निर्धारित करने का अधिकार संपत्ति नहीं है।

कोशिश "maxBufferSize" और "MaxBufferPoolSize":

<bindings> 
     <netTcpBinding> 
      <binding name="unsecureNetTcpBinding" 
        maxBufferSize="2147483647" 
        maxBufferPoolSize="2147483647" 
        maxReceivedMessageSize="2147483647"> 
       <readerQuotas maxArrayLength="1000000" /> 
       <security mode="None" /> 
      </binding> 
     </netTcpBinding> 
    </bindings> 

लेकिन असली सवाल यह है: यदि आप डेटा की बड़ी मात्रा है, तुम क्यों WCF streaming का इस्तेमाल कर रही नहीं कर रहे हैं ?? यह वही है जो इसे डिजाइन किया गया है।

http://www.haveyougotwoods.com/archive/2008/04/14/wcf-message-streaming.aspx

maxBufferSize आदि आकारों उद्देश्य पर एक काफी छोटे मान पर सेट कर रहे हैं - सेवा हमलों के इनकार से बचने के लिए। मैक्सिंट स्तर तक बस क्रैंकिंग करने से आपका सर्वर इन डॉस हमलों से कमजोर हो जाता है।

अद्यतन:
ऐसा करने का प्रयास करें: - इन पंक्तियों डाल - एक नया कंसोल अनुप्रयोग बना सकते हैं - System.Runtime.Serialization और System.ServiceModel के संदर्भ जोड़ - एक app.config जिसमें वास्तव में क्या अपने ग्राहक के पक्ष config शामिल जोड़ने अपने कंसोल अनुप्रयोग में कोड की:

class Program 
    { 
     static void Main(string[] args) 
     { 
      NetTcpBinding binding = new NetTcpBinding("unsecureNetTcpBinding"); 
      int maxArrayLength = binding.ReaderQuotas.MaxArrayLength; 
      long maxReceivedMessageSize = binding.MaxReceivedMessageSize; 
     } 
    } 
  • रन और डिबग - तुम क्या मान मिलता है ?? मुझे ठीक वही मिलता है जो आपने दर्ज किया है: binding.ReaderQuotas.MaxArrayLength के लिए "1000000", बाध्यकारी के लिए "2147483647"। मैक्स रीसेसिड मैसेज साइज।

WCF समझते हैं और config से उन सेटिंग का उपयोग करता है - 120% गारंटी। आपके ऐप में कुछ और चलना चाहिए .....

+0

मैंने maxBufferSize, maxBufferPoolSize और maxReceivedMessageSize सेट करने का प्रयास किया है लेकिन ये कॉन्फ़िगरेशन के माध्यम से भी काम नहीं करते हैं। बस दोहराते हैं, मैं maxArrayLength साथ कोड के माध्यम से इस समस्या को हल कर सकते हैं, लेकिन मुझे पता है कि कैसे config के माध्यम से यह करना चाहते हैं, चियर्स – Zephilim

+0

मैं config में maxBufferSize और MaxArrayLength की स्थापना कर रहा हूँ - कोई बात नहीं। आपके मामले में कुछ और हो रहा है ..... –

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