2009-06-09 24 views
17

Ich habe einen dynamischen Client für einen Dienst. Wie kann ich die ReaderQuotas-Eigenschaft der Endpunktbindung ändern?Ändern Sie den Endpunkt ReaderQuotas programmgesteuert

ich so versucht, aber es funktioniert nicht ...

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; 
    } 

Auch dies der ReaderQuotas Werte bleiben die Standardwerte nach tun.

Ich versuchte auch, wie diese und immer noch nicht funktioniert:

 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; 

     } 
    } 

Ich brauche dies, so kann ich mit dem Service mehr als 8 kb senden.

Antwort

33

Das Festlegen von Kontingenten für ein BindingElement nach dem Erstellen der Bindung hat keine Auswirkungen auf diese Bindung.

Edit (da Sie nicht wissen, was verwendet wird, Bindung):

können Sie Reflektion verwenden, um die Eigenschaft festzulegen. Beachten Sie, dass Sie sicherstellen sollten, dass die Bindung tatsächlich über die Eigenschaft verfügt, bevor Sie sie festlegen. Nicht alle Bindungen haben diese Eigenschaft. Wenn Sie versuchen, eine Bindung festzulegen, die dies nicht unterstützt, löst das Beispiel eine Ausnahme aus.

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); 

Hoffe das hilft Ihnen ein bisschen.

+4

+1 für diese Dinge zu erwähnen, eingestellt werden muß, bevor die Client-Proxy und/oder Service-Host erstellt werden. Einmal erstellt, sind sie unveränderlich. –

+0

Hallo Marc, Danke für die Antwort, aber ich weiß nicht, welche Art von Bindung es ist, deshalb muss ich es tun, nachdem Bindung erstellt wurde. Irgendwelche anderen Vorschläge? Danke, Adrya – Adrya

+0

Was meinst du, du weißt nicht, welche Art von Bindung es ist. Suchen Sie in der ServiceHostFactory einfach in der Bindung und ändern Sie bei Bedarf das Kontingent. Wenn das, was Sie sagen, ist, wissen Sie nicht, dass Sie das Kontingent ändern müssen, bis Sie die Bindung verwenden, dann ... kann ein Flag gesetzt werden und dann den Host (oder Client-Proxy) neu starten. – Cheeso

9

Warum lösen Sie, dass in einer solch komplexen Weise verändern nur die ReaderQuotas direkt:

dh:

WSHttpBinding WebBinding = new WSHttpBinding();

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

Dies funktioniert ohne diese seltsame Reflexion Probe.

Prost

+2

Da Client dynamisch erstellt wird, wenn es in meine Hände kommt, also Bindings und alles bereits erstellt wurde, wollte ich nur die Nachrichtengröße dieses Clients erhöhen. – Adrya

0

auch erwähnt, werden soll, dass die folgenden Eigenschaften der Bindung auch für die komplette Lösung aktualisiert werden müssen:

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

Zum Wohle anderer hier ist ein Beispiel, das programmatisch setzt die ReaderQuotas auf dem Client und dem Server zusammen mit den zwei Eigenschaften, die oben:

Client-Code:

 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)); 

Code 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(); 

Wo der Auftrag:

[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); 
} 
Verwandte Themen