2011-06-08 142 views
5

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

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

我试图ading [ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]服务接口,但它给了我一个错误说Attribute 'ServiceBehavior' is not valid on this declaration type. It is only valid on 'class' declarations.

回答

7

没有,那就是:对每个参与者配置的其他行为。每个客户端都拥有对此属性的控制权,并且服务不公开此属性,因为它可能被视为安全问题。

如果您的问题主要是关于发展(您不希望每次刷新参考时间来修改自己的行为),可以使用commonBehaviors部分只能在machine.config中定义:

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

将常见行为添加到机器上运行的每个服务/端点。这对于开发来说可能是有益的,但是你不要忘记,一旦你准备生产包,你将不得不将这个配置添加到生产配置文件中 - 因为这样可以更好地维护这样的配置文件,并在一些构建中使用它/测试服务器。

+0

我的主要问题是将该属性添加到每个客户端配置文件。看起来我必须忍受它。 – Asdfg 2011-06-08 18:38:41

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

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

+0

这是一个很好的解决方法,出于某种原因,我的app.config没有监听我的xml指示,所以这是我的最佳选择。 – 2013-01-28 18:33:09

+0

我一整天都在苦苦挣扎,这是解决问题的唯一解决方案。真诚的感谢! – KenD 2014-05-10 15:25:05