2010-03-18 2 views
8

Ich habe eine Silverlight 3.0-Anwendung, die einen WCF-Dienst verwendet, um mit der Datenbank zu kommunizieren, und wenn große Datenmengen von den Servicemethoden zurückgegeben werden, erhalte ich Service Not Found-Fehler. Ich bin ziemlich sicher, dass die Lösung darin besteht, einfach die Eigenschaft maxItemsInObjectGraph zu aktualisieren, aber ich erstelle den Service-Client progromatisch und kann nicht herausfinden, wo diese Eigenschaft gesetzt werden soll. Hier ist, was ich gerade mache:Wie kann ich die maxItemsInObjectGraph-Eigenschaft programmgesteuert von einer Silverlight-Anwendung festlegen?

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"))); 

Antwort

28

Es ist nicht verbindlich definiert, aber in Service-Verhalten.

In Silveright verwendet maxItemsInObjectGraph standardmäßig int.MaxValue.

Hier ist ein Artikel auf, wie es für .NET-Anwendung zu ändern, aber nicht Silverlight: Programattically setting the MaxItemsInObjectGraph property in client

Ein Ausschnitt des Codes:

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

Ich habe mir das angesehen, aber aus irgendeinem Grund hat die OperationDescription keine Behaviors-Eigenschaft. –

+0

Ich sehe. Ich denke, da der Client eine Silverilght-Anwendung ist, unterscheidet sich die System.ServiceModel.dll von der .NET. Aber DataContractSerializer maxItemsInObjectGraph auf Silverlight standardmäßig Int.MaxValue. Wird es in Ihrem Code auf einen kleineren Wert gesetzt? – erxuan

+0

Nein. Vielleicht war das ein Missverständnis meinerseits, aber ich dachte, dass es wesentlich weniger als int.MaxValue ausgefallen ist. Ich hatte ASPX-Seiten, die WCF-Dienste verwendet und hatte ein ähnliches Problem, und ich war in der Lage, die maxItemsInObjectGraph in der web.config zu 2147483646 zu ändern und es das Problem behoben. –

1

ändern Sie den MaxItemsInObjectGraph in Ihrem WCF-Dienst für jeden Endpunkt Wenn Sie es in Silverlight ändern, bedeutet das, dass der Client das Verhalten unterstützen kann, aber der Dienst muss es auch unterstützen.

Nachdem es in Ihrem Dienst ändern, den Proxy/Update-Service regenerieren, und Sie werden eine neue ServiceReference.config erhalten, die den neuen MaxItemsInObjectGraph Wert

+0

Der Dienst wurde bereits aktualisiert. Das Problem ist, dass all diese Einstellungen, die in die ServiceReference.config übernommen werden, ignoriert werden, wenn ich den Client im Code einrichte. –

3

die folgenden Angaben enthalten wird, ist eine Funktion, die ich verwendet habe, in einem Client-Objekt, das von

System.ServiceModel.ClientBase(Of IServiceName) 

der Zweck des Verfahrens ist, um der erbt MaxItemsInObjectGraph Wert für jede Operation programmatisch eingestellt. Dies erlaubt mir, viel komplexere Strukturen zu haben.

Private Sub IncreaseObjectCount() 
     For Each op As System.ServiceModel.Description.OperationDescription In Me.Endpoint.Contract.Operations 
      For Each dscob As System.ServiceModel.Description.DataContractSerializerOperationBehavior In op.Behaviors.FindAll(Of System.ServiceModel.Description.DataContractSerializerOperationBehavior)() 
       dcsob.MaxItemsInObjectGraph = Integer.MaxValue 
      Next dcsob 
     Next op 
    End Sub 

Ich nenne es normalerweise in den Konstruktoren des Objekts.

Verwandte Themen