如何从Silverlight应用程序以编程方式设置maxItemsInObjectGraph属性?

时间:2010-03-18 21:59:20

标签: wcf .net-3.5 silverlight-3.0 wcf-client

我有一个使用WCF服务与数据库通信的Silverlight 3.0应用程序,当我从服务方法返回大量数据时,我得到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 个答案:

答案 0 :(得分:28)

它没有在绑定中定义,而是在服务行为中定义。

在Silveright中,maxItemsInObjectGraph默认为int.MaxValue。

这是一篇关于如何为.NET应用程序更改它的文章,但不是Silverlight:Programattically setting the MaxItemsInObjectGraph property in client

代码片段:

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;
}

答案 1 :(得分:3)

以下是我在继承自

的客户端对象中使用的函数
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

我通常在对象的构造函数中调用它。

答案 2 :(得分:1)

为每个端点更改WCF服务中的maxItemsInObjectGraph,在Silverlight中更改它意味着客户端将能够支持该行为,但服务也必须支持它。

在您的服务中更改它后,重新生成代理/更新Web服务,您将获得一个新的ServiceReference.config,它将包含新的maxItemsInObjectGraph值