Modifier le point de terminaison ReaderQuotas par programmation
J'ai un client dynamique à un service. Comment puis-je changer la ReaderQuotas propriété de son point de terminaison de la liaison?
J'ai essayé comme ça, mais ça ne fonctionne pas ...
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;
}
Même après cela, l'ReaderQuotas valeurs restent ceux par défaut.
J'ai aussi essayé comme ça et ne fonctionne toujours pas:
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;
}
}
J'ai besoin de ce alors que je peux envoyer plus de 8 ko pour le service.
Vous devez vous connecter pour publier un commentaire.
De fixer des quotas sur un BindingElement après la liaison est créé n'a pas d'effet sur cette liaison.
Modifier (car vous ne savez pas ce que la liaison est utilisée):
Vous pouvez utiliser la réflexion pour définir la propriété. Remarque assurez-vous que la Liaison a effectivement la propriété avant de l'installer. Pas toutes les liaisons ont cette propriété. Si vous essayez de le régler sur une liaison qui ne le supporte pas, l'exemple lèvera une exception.
Espère que cela vous aide un peu.
Pourquoi êtes-vous résoudre que dans un tel complexe, il suffit juste de modifier le ReaderQuotas directement:
ie:
WSHttpBinding WebBinding = new WSHttpBinding();
WebBinding.ReaderQuotas.MaxArrayLength = int.MaxValue;
WebBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
WebBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
Cela va fonctionner sans que bizarre de réflexion de l'échantillon.
Acclamations
Également à noter, c'est que les propriétés suivantes de la Liaison doivent également être mis à jour pour la solution complète:
Pour le profit des autres, voici un exemple de programme définit la ReaderQuotas sur le client et le serveur avec les 2 propriétés ci-dessus:
Code Client:
Code serveur:
Où le contrat est: