Как программно установить свойство maxItemsInObjectGraph из приложения Silverlight? - PullRequest
8 голосов
/ 19 марта 2010

У меня есть приложение Silverlight 3.0, которое использует службу WCF для связи с базой данных, и когда мне возвращаются большие объемы данных из методов службы, я получаю ошибки Service Not Found. Я вполне уверен, что решение этой проблемы - просто обновить свойство maxItemsInObjectGraph, но я создаю клиент службы программно и не могу найти, где установить это свойство. Вот что я сейчас делаю:

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

Ответы [ 3 ]

28 голосов
/ 19 марта 2010

Это не определено в привязке, но в поведении службы.

В Silveright для параметра maxItemsInObjectGraph по умолчанию используется значение int.MaxValue.

Вот статья о том, как изменить его для приложения .NET, но не Silverlight: Программная установка свойства MaxItemsInObjectGraph в клиенте

Фрагмент кода:

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;
}
3 голосов
/ 26 октября 2011

Ниже приведена функция, которую я использовал внутри объекта клиента, который наследуется от

System.ServiceModel.ClientBase(Of IServiceName)

Цель метода - программно установить значение MaxItemsInObjectGraph для каждой операции. Это позволяет мне иметь гораздо более сложные структуры.

    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

Я обычно называю это в конструкторах объекта.

1 голос
/ 19 марта 2010

Изменение maxItemsInObjectGraph в вашей службе WCF для каждой конечной точки, изменение его в Silverlight означает, что клиент сможет поддерживать поведение, но служба должна также поддерживать его.

После изменения в вашем сервисе создайте заново прокси / обновите веб-сервис, и вы получите новый ServiceReference.config, который будет содержать новое значение maxItemsInObjectGraph

...