在客户端配置中设置maxItemsInObjectGraph

时间:2011-06-08 17:48:37

标签: wcf wcf-binding

我在服务器配置文件中指定了maxItemsInObjectGraph,但在创建客户端配置文件时,此属性被忽略,我必须手动将其添加到endpointBehaviors部分。

有没有办法可以在配置文件中进行一些更改,这样每次我通过Svcutil.exe生成客户端配置和代理时,这种行为会自动包含在客户端配置文件中?

我尝试将[ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]添加到服务界面,但它在错误中显示Attribute 'ServiceBehavior' is not valid on this declaration type. It is only valid on 'class' declarations.

2 个答案:

答案 0 :(得分:8)

行为通常是本地设置(您可以为客户端和服务器设置不同的值,并且通信仍然可以正常工作),因此它们不会在WSDL中公开(因此svcutil将无法找到该值)

您基本上有两种选择:每次生成时更新客户端配置,或者在代码中,在创建代理类实例时更新MIIOG属性,类似于下面的代码。

ServiceClient client = new ServiceClient();
foreach (var operationDescription in client.Endpoint.Contract.Operations)
{
    DataContractSerializerOperationBehavior dcsob =
        operationDescription.Behaviors.Find<DataContractSerializerOperationBehavior>();
    if (dcsob != null)
    {
        dcsob.MaxItemsInObjectGraph = int.MaxValue;
    }
}

请注意,如果您手写客户端实现而不是使用自动生成的存根,则Endpoint可通过用于创建服务接口通道的ChannelFactory获得。

答案 1 :(得分:7)

不,这是每个参与者配置的另一种行为。每个客户端都可以控制此属性,并且服务不会公开此属性,因为它可能被视为安全问题。

如果您的问题主要与开发有关(每次刷新引用时都不想修改行为),可以使用commonBehaviors部分,该部分只能在machine.config中定义:

<commonBehaviors>
  <behaviors>
    <endpointBehaviors>
      <dataContractSerializer maxItemsInObjectGraph="..." />
    </endpointBehaviors>
  </behaviors>
</commonBehaviors>

将常见行为添加到计算机上运行的每个服务/端点。它可能对开发有好处,但你不能忘记,一旦你准备生产包,你将不得不将这个配置添加到生产的配置文件 - 因为最好不断维护这样的配置文件并在一些构建中使用它/ test server。