Изменять конечную точку 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;
}
Даже после этого значения 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;
}
}
Мне нужно это, поэтому я могу отправить более 8 кб в службу.
Ответы
Ответ 1
Настройка квот в BindingElement после создания привязки не влияет на эту привязку.
Изменить (поскольку вы не знаете, какая привязка используется):
Вы можете использовать отражение, чтобы установить свойство. Обратите внимание, что перед настройкой убедитесь, что привязка действительно имеет свойство. Не все привязки имеют это свойство. Если вы попытаетесь установить его на привязку, которая не поддерживает его, пример выдает исключение.
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);
Надеюсь, это поможет вам немного.
Ответ 2
Почему вы решаете это таким сложным способом, просто измените ReaderQuotas напрямую:
т
WSHttpBinding WebBinding = новый WSHttpBinding();
WebBinding.ReaderQuotas.MaxArrayLength = int.MaxValue;
WebBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
WebBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
Это будет работать без этой странной рефлексивной выборки.
Приветствия
Ответ 3
Также следует отметить, что для полного решения необходимо обновить следующие свойства Binding:
binding2.MaxBufferSize = 2147483647;
binding2.MaxReceivedMessageSize = 2147483647;
В интересах других здесь приведен пример, который программно устанавливает 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;
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));
Код сервера:
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);
}