修复WCF反序列化错误

时间:2012-10-08 10:48:30

标签: wcf tcp app-config

我得到的错误如下:

  

可以序列化或反序列化的最大项目数   对象图是65536.更改对象图或增加   MaxItemsInObjectGraph quota。

这是我的app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IClusterControllerService">
                    <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
                </binding>
                <binding name="NetTcpBinding_IClusterManagementService">
                    <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
                </binding>

            </netTcpBinding>
        </bindings>
        <client>
            <endpoint 
                address="some_address"
                binding="netTcpBinding" 
                bindingConfiguration="NetTcpBinding_IClusterControllerService"
                contract="ClusterControllerService.IClusterControllerService"
                name="NetTcpBinding_IClusterControllerService"
                behaviorConfiguration="BigObjectGraphBehavior">
            </endpoint>
            <endpoint 
                address="some_address"
                binding="netTcpBinding" 
                bindingConfiguration="NetTcpBinding_IClusterManagementService"
                contract="ClusterManagementService.IClusterManagementService"
                name="NetTcpBinding_IClusterManagementService"
                behaviorConfiguration="BigObjectGraphBehavior">
            </endpoint>
        </client>
        <behaviors>
            <endpointBehaviors>
                <behavior name="BigObjectGraphBehavior">
                    <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                </behavior>
            </endpointBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

似乎maxItemsInObjectGraph设置没有生效。 我还有其他地方可以设置此设置吗?

1 个答案:

答案 0 :(得分:1)

您的配置似乎是正确的。

可以在客户端和服务器端设置此设置。另请检查此错误的来源(如果服务器上的IncludeExceptionDetailInFaults为真,则将异常返回给客户端)

以下是此行为的示例配置。

//server side
<behaviors>
  <serviceBehaviors>
    <behavior name="LargeServiceBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

//client side
<behaviors>
  <endpointBehaviors>
    <behavior name="LargeEndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

如果你动态地在我们的客户端上启动你的端点(使用ChannelFactory),你必须手动设置MaxItemsInObjectGraph属性。

foreach ( var operation in channelFactory.Endpoint.Contract.Operations )  
{  
    var behavior = operation.Behaviors.Find() as DataContractSerializerOperationBehavior;  
    if ( behavior != null )  
    {  
        behavior.MaxItemsInObjectGraph = 2147483647;      
    }  
}