2009-06-09 24 views
17

Mam klienta dynamicznego do usługi. Jak mogę zmienić właściwość ReaderQuotas powiązania punktu końcowego?Modyfikuj punkt końcowy ReaderQuotas programowo

Próbowałem tak, ale to nie działa ...

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

Nawet po zrobieniu tego z ReaderQuotas wartości pozostają te domyślne.

Próbowałem też tak i nadal nie działa:

 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; 

     } 
    } 

muszę to więc mogę wysłać więcej niż 8 kb do usługi.

Odpowiedz

33

Ustawianie przydziałów w BindingElement po utworzeniu powiązania nie ma wpływu na to powiązanie.

Edit (ponieważ nie wiem, co służy wiązaniami):

Można użyć refleksji ustawić właściwość. Zauważ, że powinieneś upewnić się, że bindowanie ma właściwość przed jej ustawieniem. Nie wszystkie wiązania mają tę właściwość. Jeśli spróbujesz ustawić powiązanie, które go nie obsługuje, w przykładzie zostanie zgłoszony wyjątek.

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

Mam nadzieję, że to ci trochę pomoże.

+4

+1 dla wspomnieć te rzeczy muszą być ustawione przed proxy klienta i/lub host usługi są tworzone. Raz utworzone, są niezmienne. –

+0

Cześć Marc, Dziękuję za odpowiedź, ale nie wiem, jaki rodzaj wiązania jest, dlatego muszę to zrobić po utworzeniu wiązania. Jakieś inne sugestie? Dzięki, Adrya – Adrya

+0

Co masz na myśli, nie wiesz, jakie to wiążące. W ServiceHostFactory wystarczy spojrzeć na wiązanie i zmodyfikować limit, jeśli zajdzie taka potrzeba. Jeśli mówisz, że nie musisz modyfikować limitu, dopóki nie użyjesz wiązania, możesz ... ustawić flagę, a następnie zrestartować hosta (lub proxy klienta). – Cheeso

9

Czemu rozwiązanie, które w taki sposób złożony, wystarczy zmienić ReaderQuotas bezpośrednio:

tj:

wsHttpBinding WebBinding = new wsHttpBinding();

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

To zadziała bez tej dziwnej próbki odbicia.

Cheers

+2

Ponieważ klient jest tworzony dynamicznie, gdy dostanie się w moje ręce, więc wiązania i wszystko jest już stworzone, chciałem tylko zwiększyć rozmiar wiadomości tego klienta. – Adrya

0

Ponadto należy zauważyć, że następujące właściwości wiązania również muszą zostać zaktualizowane do kompletnego rozwiązania:

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

dla dobra innych, oto próbka że programowo ustawia ReaderQuotas zarówno na kliencie i na serwerze wraz z 2 mieszkań powyżej:

kod Klient:

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

Serwer:

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

przypadku zamówień:

[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); 
} 
Powiązane problemy