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?
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
Vous devez vous connecter pour publier un commentaire.
J'ai tout compris!!! Mon client code était faux. J'ai été réglage de la MaxItemsInObjectGraph après j'avais déjà créé ma chaîne. Ainsi, le MaxItemInObjectGraph propriété a eu aucun effet sur le déjà créé canal. (Ce WCF truc est si confus pour moi - je suis habituellement juste de copier et de coller le code, sans vraiment savoir ce que je fais), Voici le code corrigé:
+1 pour admettre que "je suis juste de copier et de coller le code, sans vraiment savoir ce que je fais"
OriginalL'auteur Corey Burnett
Vous devez définir la MaxItemsInObjectGraph sur le dataContractSerializer à l'aide d'un comportement à la fois le client et le service. Voir ici pour un exemple.
Nope, j'ai été comme je l'ai oubliée dans votre code. Qui doit prendre soin d'elle et je n'ai aucune idée de pourquoi ça ne marche pas.
Merci. J'ai fait un peu de dépannage. Il semble que la sérialisation est bien sur le côté serveur. Le problème est avec la désérialisation sur le côté client. Mais de ce que je peux dire à mon client code est correct (voir ci-dessus). Je me demande ce que je fais de mal.
OriginalL'auteur Maurice
Sur le côté client, une autre façon d'y parvenir est de créer un personnalisé IEndPointBehavior mise en œuvre - se référer à la http://canbilgin.wordpress.com/2010/06/25/how-to-set-maxitemsinobjectgraph-programmatically-for-client/.
Ceci est particulièrement utile lors de la mise en œuvre d'un client avec le Windsor WcfFacility
OriginalL'auteur D Barndon
Vous êtes de retour d'une liste générique ou un tableau qui a une taille de plus de 65 536. dans vos requêtes, à l'aide d'un select top 60000 ou non l'ajout de plus de 60k éléments permettra de résoudre votre problème.
OriginalL'auteur Uğur Gümüşhan