8

我有一个 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")));
4

3 回答 3

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;
}
于 2010-03-18T23:15:47.543 回答
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

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

于 2011-10-26T03:23:40.930 回答
1

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

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

于 2010-03-19T17:57:55.533 回答