2009-06-09 28 views
17

Tôi có một khách hàng năng động cho một dịch vụ. Làm thế nào tôi có thể thay đổi tài sản ReaderQuotas của nó endpoint ràng buộc?Sửa đổi điểm cuối ReaderQuotas theo chương trình

tôi đã cố gắng như thế này nhưng nó không hoạt động ...

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

Ngay cả sau khi làm điều này các ReaderQuotas giá trị vẫn là những mặc định.

Tôi cũng đã cố gắng như thế này và vẫn không hoạt động:

 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; 

     } 
    } 

tôi cần điều này để tôi có thể gửi nhiều hơn 8KB đến dịch vụ.

Trả lời

33

Đặt hạn ngạch trên BindingElement sau khi tạo liên kết không ảnh hưởng đến liên kết đó.

Chỉnh sửa (vì bạn không biết ràng buộc nào được sử dụng):

Bạn có thể sử dụng phản ánh để đặt thuộc tính. Lưu ý bạn nên chắc chắn rằng các ràng buộc thực sự có tài sản trước khi thiết lập nó. Không phải tất cả các ràng buộc đều có thuộc tính này. Nếu bạn cố gắng đặt nó trên một ràng buộc không hỗ trợ nó, ví dụ sẽ ném một ngoại lệ.

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

Hy vọng điều này sẽ giúp bạn một chút.

+4

+1 đề cập đến những điều này phải được thiết lập trước khi các proxy client và/hoặc máy chủ dịch vụ được tạo ra. Khi được tạo, chúng không thay đổi. –

+0

Xin chào Marc, Cảm ơn bạn đã trả lời, nhưng tôi không biết loại ràng buộc đó là gì, đó là lý do tại sao tôi cần phải làm điều đó sau khi ràng buộc được tạo ra. Bất kỳ đề xuất nào khác? Cảm ơn, Adrya – Adrya

+0

Ý của bạn là gì, bạn không biết nó là loại ràng buộc gì. Trong ServiceHostFactory, chỉ cần nhìn vào ràng buộc và sửa đổi hạn ngạch nếu bạn cần. Nếu những gì bạn đang nói là, bạn không biết bạn cần phải sửa đổi các hạn ngạch cho đến sau khi bạn sử dụng các ràng buộc, sau đó .. có thể thiết lập một lá cờ và sau đó khởi động lại máy chủ (hoặc proxy của khách hàng). – Cheeso

9

Tại sao các bạn giải quyết điều đó theo một cách phức tạp như vậy, chỉ cần thay đổi ReaderQuotas trực tiếp:

ví dụ:

wsHttpBinding WebBinding = new wsHttpBinding();

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

Điều này sẽ hoạt động mà không có mẫu phản chiếu lạ.

Cheers

+2

Bởi vì khách hàng được tạo động khi nó được bàn tay của tôi, do đó, ràng buộc và tất cả mọi thứ đã được tạo ra, tôi chỉ muốn tăng kích thước tin nhắn của khách hàng đó. – Adrya

0

Cũng cần lưu ý, đó là các thuộc tính sau của Binding cũng cần phải được cập nhật cho các giải pháp hoàn chỉnh:

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

Vì lợi ích của những người khác ở đây là một mẫu mà lập trình đặt ReaderQuotas trên cả máy khách và máy chủ cùng với 2 thuộc tính trên:

khách hàng mã:

 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 đang

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

Trong trường hợp hợp đồng là:

[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); 
} 
Các vấn đề liên quan