MaxItemsInObjectGraph


Há algum tempo, eu comentei aqui sobre os limites e cotas que o WCF possui, que se não se atentar em ajustar de acordo com a sua necessidade, exceções começam a ser disparadas se você excede os valores que lá estão.

Além daquelas configurações, ainda há uma outra configuração/cota que interfere na quantidade de informações que trafegam entre as partes, que é a MaxItemsInObjectGraph. Essa propriedade recebe um número inteiro (que por padrão é 65.536 (64KB)), que especifica a quantidade máxima de objetos que podem ser serializados ou deserializados pelo DataContractSerializer. Se tentar enviar e/ou receber uma quantidade de objetos maior que o valor especificado por essa cota, você pode se deparar com a seguinte exceção do tipo SerializationException, como é mostrado abaixo:

Unhandled Exception: System.ServiceModel.CommunicationException: There was an error while trying to serialize parameter http://tempuri.org/:clientes. The InnerException message was ‘Maximum number of items that can be serialized or deserialized in an object graph is ‘200’. Change the object graph or increase the MaxItemsInObjectGraph quota. ‘.  Please see InnerException for more details. —> Systm.Runtime.Serialization.SerializationException: Maximum number of items that can be serialized or deserialized in an object graph is ‘200’. Change the object graph or increase the MaxItemsInObjectGraph quota.

A configuração desta opção não está em nível de binding, ao contrário do que acontece com as outras cotas, pois ela está relacionada ao serializador que o serviço utiliza para uma operação em particular. É importante dizer que essa configuração deve estar sincronizada entre o cliente e serviço, caso contrário, o erro persistirá. Há diversas formas para configurarmos ela, e a primeira delas é através da propriedade MaxItemsInObjectGraph exposta pelo atributo ServiceBehaviorAttribute:

[ServiceBehavior(MaxItemsInObjectGraph = 1000)]
public class Servico : IContrato
{
    public Cliente[] Ping(Cliente[] clientes)
    {
        //…
    }
}

A outra forma de configuração é acessando diretamente as descrições do serviço, de forma imperativa, onde poderá customizar essa informação para uma operação específica. O código abaixo mostra como proceder para alterá-la do lado do serviço e do lado do cliente, respectivamente:

serviceHost
    .Description
    .Endpoints[0]
    .Contract
    .Operations[0]
    .Behaviors
    .Find<DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = 1000;

proxy
    .Endpoint
    .Contract
    .Operations[0]
    .Behaviors
    .Find<DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = 1000;

Além disso, ainda podemos optar por configurá-la através do respectivo arquivo de configuração da aplicação (cliente ou serviço). Para isso, utilizamos o elemento dataContractSerializer, que é um behavior que será aplicado no endpoint do serviço, como podemos reparar abaixo:

<configuration>
    <system.serviceModel>
        <behaviors>
            <endpointBehaviors>
                <behavior name=”config”>
                    <dataContractSerializer maxItemsInObjectGraph=”1000″ />
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <client>
            <endpoint address=””
                      behaviorConfiguration=”config”
                      binding=”basicHttpBinding”
                      contract=”IContrato” />
        </client>
    </system.serviceModel>
</configuration>

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s