Comment réparer MaxItemsInObjectGraph erreur?

J'ai un Réparateur de service WCF et j'obtiens l'erreur suivante: nombre Maximal d'éléments qu'il est possible de sérialiser ou désérialiser un objet graphique est "65536'. Changement de l'objet graphique ou d'augmenter le MaxItemsInObjectGraph quota.

Je pensais que j'avais résolu ce problème, mais apparemment pas. Voici mon code:

- Je utiliser un .SVC fichier qui utilise une usine sur mesure comme ceci:

<%@ ServiceHost Language="C#" Debug="true" Service="myService" Factory="myCustomWebServiceHostFactory" %>

Voici le code pour l'personnalisée en usine

public class myCustomWebServiceHost : WebServiceHost
{
    public myCustomWebServiceHost()
    {
    }

    public myCustomWebServiceHost(object singletonInstance, params Uri[] baseAddresses)
        : base(singletonInstance, baseAddresses)
    {
    }

    public myCustomWebServiceHost(Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
    {
    }

    protected override void OnOpening()
    {
        foreach (var endpoint in Description.Endpoints)
        {
            var binding = endpoint.Binding as WebHttpBinding;
            if (binding != null)
            {
                const int fiveMegaBytes = 5242880;
                binding.MaxReceivedMessageSize = fiveMegaBytes;
                binding.MaxBufferSize = fiveMegaBytes;
                binding.MaxBufferPoolSize = fiveMegaBytes;
            }
        }
        base.OnOpening();
    }
}

class myCustomWebServiceHostFactory : WebServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return new myCustomWebServiceHost(serviceType, baseAddresses);
    }
}

Service:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)]
public class myService
{
...service implementation code goes here
}

Client:

public class myClient
{
    WebChannelFactory<IMyService> cf;
    IMyService channel;

    public myClient()
    {
        WebHttpBinding _binding = new WebHttpBinding();
        _binding.MaxBufferPoolSize = 5000000;
        _binding.MaxBufferSize = 5000000;
        _binding.MaxReceivedMessageSize = 5000000;
        _binding.TransferMode = TransferMode.Streamed;
        _binding.ReceiveTimeout = new TimeSpan(0, 0, 30);
        _binding.ReaderQuotas.MaxArrayLength = 5000000;
        Uri _uri = new Uri("http://myserviceurl");
        cf = new WebChannelFactory<IMyService>(_binding, _uri);
        channel = cf.CreateChannel();
        foreach (OperationDescription op in cf.Endpoint.Contract.Operations)
        {
            var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>();
            if (dataContractBehavior != null)
            {
                dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
            }
        }
    }
        ...client implementation code goes here
}

Mise à JOUR: j'ai fait un peu de dépannage. Il semble que la sérialisation partie fonctionne bien sur le serveur. Je suis capable de faire un GET à partir d'un navigateur et j'ai récupérer toutes les données au format XML. C'est donc bien fonctionner. Il semble être la désérialisation partie qui est à l'origine de l'erreur. Si vous regardez au-dessus dans le code pour myClient vous verrez comment je suis tenté de mettre le MaxItemsInObjectGraph propriété pour le DataContractSerializer comportement. Suis-je le faire correctement?

J'ai lu quelque part que la mise MaxItemsInObjectGraph dans l'attribut ne fonctionne pas. Essayez de le définir dans la configuration, il est du comportement en service appelé dataContractSerializer.
Ok. Qui permet de. Mais c'est là que je m'embrouille. De ce que je peux dire, vu que je suis en utilisant un fichier SVC et personnalisée en Usine, mon application va ignorer tous les paramètres dans mon fichier de config. Donc je ne sais pas comment définir le comportement dans le code.
FYI - c'est là que j'ai trouvé la solution que j'ai mis en place: stackoverflow.com/questions/4812668/...
Comportement du paramètre de code dans l'usine ou le service personnalisé de l'hôte aura probablement le même effet que l'aide de l'attribut parce que vous allez rechercher sur le comportement en service de la description et de changer sa configuration. Je ne suis vraiment pas sûr si je suis à droite avec mon ancien déclaration, mais je me souviens que j'ai lu sur quelques problèmes avec cette.

OriginalL'auteur Corey Burnett | 2011-06-09