以编程方式修改端点ReaderQuotas

Adr*_*rya 18 c# wcf readerquotas

我有一个服务的动态客户端.如何更改其端点绑定的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;
   }
Run Code Online (Sandbox Code Playgroud)

即使这样做,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;

         }
   }
Run Code Online (Sandbox Code Playgroud)

我需要这个,所以我可以发送超过8kb的服务.

Ono*_*ots 34

创建绑定后在BindingElement上设置配额对该绑定没有影响.

编辑(因为您不知道使用了什么绑定):

您可以使用反射来设置属性.请注意,在设置之前,应确保Binding实际具有该属性.并非所有绑定都具有此属性.如果您尝试在不支持它的绑定上设置它,该示例将引发异常.

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);
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助.

  • 在创建客户端代理和/或服务主机之前,必须设置+1来提及这些内容.一旦创建,它们就是不可变的. (5认同)

No *_*ema 10

为什么要以这种复杂的方式解决这个问题,只需直接改变ReaderQuotas:

即:

WSHttpBinding WebBinding = new WSHttpBinding();

WebBinding.ReaderQuotas.MaxArrayLength = int.MaxValue; WebBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue; WebBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;

没有那种奇怪的反射样本,这将有效.

干杯

  • 因为客户端是在我手中动态创建的,所以绑定和所有内容都已创建,我只想增加该客户端的消息大小. (2认同)