2009-06-09 18 views
17

मेरे पास एक सेवा के लिए एक गतिशील ग्राहक है। मैं अपने एंडपॉइंट बाइंडिंग की रीडरक्वोटास संपत्ति कैसे बदल सकता हूं?एंडपॉइंट संशोधित करें ReaderQuotas प्रोग्रामेटिक

मैं इस तरह की कोशिश की लेकिन यह काम नहीं करता ...

DynamicProxyFactory factory = new DynamicProxyFactory(m_serviceWsdlUri); 

foreach (ServiceEndpoint endpoint in factory.Endpoints) 
{ 
    Binding binding = endpoint.Binding; 

    binding.GetProperty<XmlDictionaryReaderQuotas>(new BindingParameterCollection()).MaxArrayLength = 2147483647 
    binding.GetProperty<XmlDictionaryReaderQuotas>(new BindingParameterCollection()).MaxBytesPerRead =2147483647; 
    binding.GetProperty<XmlDictionaryReaderQuotas>(new BindingParameterCollection()).MaxDepth = 2147483647; 
    binding.GetProperty<XmlDictionaryReaderQuotas>(new BindingParameterCollection()).MaxNameTableCharCount = 2147483647; 
    binding.GetProperty<XmlDictionaryReaderQuotas>(new BindingParameterCollection()).MaxStringContentLength = 2147483647; 
    } 

यहां तक ​​कि इस ReaderQuotas मूल्यों डिफ़ॉल्ट लोगों रहने के करने के बाद।

मैं भी इस तरह की कोशिश की है और अभी भी काम नहीं करता:

 DynamicProxyFactory factory = new DynamicProxyFactory(m_serviceWsdlUri); 

    foreach (ServiceEndpoint endpoint in factory.Endpoints) 
    { 
     System.ServiceModel.Channels.BindingElementCollection bec = endpoint.Binding.CreateBindingElements(); 

     System.ServiceModel.Channels.TransportBindingElement tbe = bec.Find<System.ServiceModel.Channels.TransportBindingElement>(); 

     tbe.MaxReceivedMessageSize = 2147483647; 
     tbe.MaxBufferPoolSize = 2147483647; 
     TextMessageEncodingBindingElement textBE = bec.Find<TextMessageEncodingBindingElement>(); 

     if (textBE != null) 
     { 

      textBE.ReaderQuotas.MaxStringContentLength = 2147483647; 
      textBE.ReaderQuotas.MaxArrayLength = 2147483647; 
      textBE.ReaderQuotas.MaxBytesPerRead = 2147483647; 
      textBE.ReaderQuotas.MaxDepth = 2147483647; 
      textBE.ReaderQuotas.MaxNameTableCharCount = 2147483647; 

     } 
    } 

मैं की जरूरत है इस तो मैं सेवा के लिए 8kb की तुलना में अधिक भेज सकते हैं।

उत्तर

33

बाध्यकारी बनाने के बाद बाध्यकारी एलिमेंट पर कोटा सेट करना उस बाध्यकारी पर कोई प्रभाव नहीं पड़ता है।

संपादित करें (जब से तुम बंधन क्या प्रयोग किया जाता है पता नहीं है):

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

Binding binding = endpoint.Binding; 

XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); 
myReaderQuotas.MaxStringContentLength = _sanebutusablelimit_; 
myReaderQuotas.MaxArrayLength = _sanebutusablelimit_; 
myReaderQuotas.MaxBytesPerRead = _sanebutusablelimit_; 
myReaderQuotas.MaxDepth = _sanebutusablelimit_; 
myReaderQuotas.MaxNameTableCharCount = _sanebutusablelimit_; 

binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null); 

आशा है कि इससे आपको थोड़ा सा मदद मिलेगी।

+4

+1 इन बातों का उल्लेख के लिए पहले ग्राहक प्रॉक्सी और/या सेवा मेजबान बनाई गई हैं स्थापित किया जाना है। एक बार बनाया गया, वे अपरिवर्तनीय हैं। –

+0

हाय मार्क, उत्तर के लिए धन्यवाद, लेकिन मुझे नहीं पता कि यह किस तरह का बाध्यकारी है, इसलिए मुझे बाध्यकारी बनाने के बाद इसे करने की ज़रूरत है। कोई अन्य सुझाव? धन्यवाद, एड्रिया – Adrya

+0

आपका क्या मतलब है, आप नहीं जानते कि यह किस तरह का बाध्यकारी है। ServiceHostFactory में, यदि आपको आवश्यकता हो तो कोटा को बाध्यकारी और संशोधित करें। यदि आप जो कह रहे हैं, तो आप नहीं जानते कि आपको बाध्यकारी उपयोग करने के बाद तक कोटा को संशोधित करने की आवश्यकता है, फिर ..maybe ध्वज सेट करें और फिर होस्ट (या क्लाइंट प्रॉक्सी) को पुनरारंभ करें। – Cheeso

9

तुम क्यों सुलझाने रहे हैं कि एक ऐसी जटिल तरीके से, बस सीधे ReaderQuotas बदल:

अर्थात्:

WSHttpBinding WebBinding = नए WSHttpBinding();

वेब बाइंडिंग। रीडरक्वॉट्स। मैक्सअरेरेलेथेंथ = int.MaxValue; WebBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue; WebBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;

यह उस अजीब प्रतिबिंब नमूना के बिना काम करेगा।

चीयर्स

+2

क्योंकि क्लाइंट गतिशील रूप से बनाया गया है जब यह मेरे हाथों में आता है, इसलिए बाइंडिंग और सब कुछ पहले से ही बनाया गया है, मैं बस उस क्लाइंट के संदेश आकार को बढ़ाना चाहता था। – Adrya

0

भी ध्यान दिया जाना चाहिए, कि बाध्यकारी के निम्नलिखित गुण भी पूर्ण समाधान के लिए अद्यतन करने की आवश्यकता है:

binding2.MaxBufferSize = 2147483647; 
binding2.MaxReceivedMessageSize = 2147483647; 

दूसरों को यहाँ के लाभ के लिए एक नमूना है कि प्रोग्राम के रूप में है

क्लाइंट कोड:

 WebHttpBinding binding2 = new WebHttpBinding(); 
     XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); 
     myReaderQuotas.MaxStringContentLength = 2147483647; 
     myReaderQuotas.MaxArrayLength = 2147483647; 
     myReaderQuotas.MaxBytesPerRead = 2147483647; 
     myReaderQuotas.MaxDepth = 2147483647; 
     myReaderQuotas.MaxNameTableCharCount = 2147483647; 

     binding2.GetType().GetProperty("ReaderQuotas").SetValue(binding2, myReaderQuotas, null); 
     binding2.MaxBufferSize = 2147483647; 
     binding2.MaxReceivedMessageSize = 2147483647; 
     ServiceEndpoint ep = new ServiceEndpoint(ContractDescription.GetContract(typeof(IMyService)), 
      binding2, new EndpointAddress("http://localhost:9000/MyService")); 

     WebChannelFactory<IMyService> cf2 = new WebChannelFactory<IMyService>(ep); 

     IMyService serv = cf2.CreateChannel(); 
     serv.PrintNameDesc("Ram", new string('a', 100*1024*1024)); 
012 दोनों क्लाइंट और इसके बाद के संस्करण 2 गुण के साथ सर्वर पर ReaderQuotas सेट

सर्वर कोड:

 WebHttpBinding binding2 = new WebHttpBinding(); 
     XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); 
     myReaderQuotas.MaxStringContentLength = 2147483647; 
     myReaderQuotas.MaxArrayLength = 2147483647; 
     myReaderQuotas.MaxBytesPerRead = 2147483647; 
     myReaderQuotas.MaxDepth = 2147483647; 
     myReaderQuotas.MaxNameTableCharCount = 2147483647; 

     binding2.GetType().GetProperty("ReaderQuotas").SetValue(binding2, myReaderQuotas, null); 
     binding2.MaxBufferSize = 2147483647; 
     binding2.MaxReceivedMessageSize = 2147483647; 

     WebServiceHost host2 = new WebServiceHost(typeof(MyService)); 
     host2.AddServiceEndpoint(typeof(IMyService), binding2, new Uri("http://localhost:9000/MyService")); 

     host2.Open(); 

कहाँ अनुबंध है:

[ServiceContract] 
public interface IMyService 
{ 
    [WebInvoke(Method = "PUT", 
     UriTemplate = "My/{name}/", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     ResponseFormat = WebMessageFormat.Xml, 
     RequestFormat = WebMessageFormat.Xml)] 
    [OperationContract] 
    void PrintNameDesc(string name, string desc); 
} 
संबंधित मुद्दे