2011-01-27 13 views
9

Tengo crear un EndpointAddress así¿Cómo agregar maxItemsInObjectGraph programáticamente sin usar el archivo de configuración?

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

pero no podía añadir el comportamiento de esta variable mediante programación.

El comportamiento es la siguiente .:

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

Respuesta

28

En el servidor hay que añadir que en el atributo ServiceBehavior:

[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)] 

En el cliente tiene que aplicar al punto final. En este ejemplo se puede ver cómo agregarlo a todos los puntos finales en su ChannelFactory:

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

funcionó a la perfección, gracias –

+0

Niza - utilizado ayer . Gracias – Liam

+0

Pero tenga en cuenta que si está implementando su propio DataOntrolSerializerOperationBehavior, por ejemplo, para conservar las referencias de ciclo, debe especificar MaxItemsInObjectGraph en el constructor para DataContractSerializer. –

2

En el lado del servidor, también puede:

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); 
} 
Cuestiones relacionadas