プログラムでエンドポイントReaderQuotasを変更
-
13-09-2019 - |
質問
私は、サービスへの動的クライアントを持っています。どのように私はそれの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キロバイト以上のものを送信することができ、これを必要とする。
解決
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);
これはあなたに少しお役に立てば幸いです。
他のヒント
なぜあなたは、このような複雑な方法で、ちょうど直接ReaderQuotasを変更することを解決しています
すなわち
WSHttpBinding WebBinding =新しいWSHttpBinding();
の WebBinding.ReaderQuotas.MaxArrayLength = int.MaxValue。 WebBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue。 WebBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue; の
これはその奇妙な反射サンプルなしで動作します。
乾杯
また、注意すべきで、バインディングの次のプロパティも完全なソリューションのために更新する必要があるということです。
binding2.MaxBufferSize = 2147483647;
binding2.MaxReceivedMessageSize = 2147483647;
ここで、他の利益のためには、プログラム、クライアントと上記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;
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));
Serverのコード:
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);
}