2010-03-18 4 views
8

J'ai une application Silverlight 3.0 qui utilise un service WCF pour communiquer avec la base de données, et lorsque de grandes quantités de données sont renvoyées à partir des méthodes de service, j'obtiens des erreurs Service Not Found. Je suis assez confiant que la solution à elle est simplement de mettre à jour la propriété maxItemsInObjectGraph, mais je crée le client de service progrogrammatically et ne peux pas trouver où placer cette propriété. Voici ce que je fais en ce moment:Comment puis-je définir la propriété maxItemsInObjectGraph par programme à partir d'une application Silverlight?

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None) 
{ 
    MaxReceivedMessageSize = int.MaxValue,     
    MaxBufferSize = int.MaxValue 
};       

MyService.MyServiceServiceClient client = new MyService.MyServiceProxyServiceClient(binding, new EndpointAddress(new Uri(Application.Current.Host.Source, "../MyService.svc"))); 

Répondre

28

Ce n'est pas défini dans la liaison, mais dans le comportement de service.

Dans Silveright, maxItemsInObjectGraph est par défaut int.MaxValue.

Voici un article sur la façon de le changer pour l'application .NET, mais pas Silverlight: Programattically setting the MaxItemsInObjectGraph property in client

Un extrait du code:

protected ISecurityAdministrationService GetSecAdminClient() 
{ 
    ChannelFactory<ISecurityAdministrationService> factory = new ChannelFactory<ISecurityAdministrationService>(wsSecAdminBinding, SecAdminEndpointAddress); 
    foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
    { 
     DataContractSerializerOperationBehavior dataContractBehavior =op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; 
     if (dataContractBehavior != null) 
     { 
      dataContractBehavior.MaxItemsInObjectGraph = 2147483647; 
     } 
    } 
    ISecurityAdministrationService client = factory.CreateChannel(); 
    return client; 
} 
+0

J'ai examiné cela, mais pour une raison quelconque, OperationDescription n'a pas de propriété Behaviors. –

+0

Je vois. Je suppose que parce que le client est une application Silverilght, le System.ServiceModel.dll est différent de celui du .NET. Mais DataContractSerializer maxItemsInObjectGraph sur Silverlight est par défaut int.MaxValue. Allez-vous le définir à une plus petite valeur dans votre code? – erxuan

+0

Non. Peut-être que c'était un malentendu de ma part, mais je pensais que c'était par défaut beaucoup moins que int.MaxValue. J'ai eu des pages aspx qui utilisaient des services WCF et avait un problème similaire, et j'ai été en mesure de modifier le maxItemsInObjectGraph dans le web.config pour être 2147483646 et il a résolu le problème. –

1

Modifier le MaxItemsInObjectGraph dans votre service WCF pour chaque point final En le modifiant dans Silverlight, le client sera capable de supporter le comportement, mais le service doit le supporter aussi.

Après avoir changé dans votre service, régénèrent le service proxy Web/mise à jour, et vous obtiendrez une nouvelle ServiceReference.config, qui comprendra la nouvelle valeur MaxItemsInObjectGraph

+0

Le service est déjà mis à jour. Le problème est que tous les paramètres qui sont placés dans le ServiceReference.config sont ignorés lorsque je le configure dans le code. –

3

Ce qui suit est une fonction que je l'ai utilisé l'intérieur d'un objet client qui hérite de

System.ServiceModel.ClientBase(Of IServiceName) 

le but de la méthode est de définir par programmation la valeur MaxItemsInObjectGraph pour chaque opération. Cela me permet d'avoir des structures beaucoup plus complexes. Je l'appelle habituellement dans les constructeurs de l'objet.

Questions connexes