2011-01-27 23 views
9

tôi đã tạo ra một EndpointAddress như thếLàm thế nào để thêm maxItemsInObjectGraph lập trình mà không cần sử dụng tệp cấu hình?

EndpointAddress address = new EndpointAddress("http://example.com/services/OrderService.svc"); 

Nhưng tôi không thể thêm hành vi để Endpoint này lập trình.

Các hành vi được đưa ra dưới đây .:

<behaviors> 
    <endpointBehaviors> 
    <behavior name="NewBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="6553600" /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Trả lời

28

Trên máy chủ bạn cần phải thêm nó vào Thuộc tính ServiceBehavior:

[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)] 

Trên client, bạn phải áp dụng nó vào các thiết bị đầu cuối. Trong ví dụ này, bạn có thể xem làm thế nào để thêm nó vào tất cả các thiết bị đầu cuối trong ChannelFactory của bạn:

var factory = new ChannelFactory<IInterface>(...); 
foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
    { 
     var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     if (dataContractBehavior != null) 
     { 
      dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue; 
     } 
    } 
+1

nó làm việc một cách hoàn hảo, nhờ –

+0

Nice - sử dụng nó ngày hôm qua . Cảm ơn – Liam

+0

Nhưng lưu ý rằng nếu bạn đang thực hiện DataOntrolSerializerOperationBehavior của riêng mình, ví dụ, để duy trì các tham chiếu chu trình, bạn phải chỉ định MaxItemsInObjectGraph trong hàm tạo tới DataContractSerializer. –

2

Mở Server Side, bạn cũng có thể:

ServiceHost host = new ServiceHost(); 
ServiceBehaviorAttribute sba = host .Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
      if (sba == null) 
      { 
       sba = new ServiceBehaviorAttribute(); 
       sba.MaxItemsInObjectGraph = int.MaxValue; 
       host.Description.Behaviors.Add(sba); 
} 
Các vấn đề liên quan