我在服务器配置文件中指定了maxItemsInObjectGraph,但在创建客户端配置文件时,此属性被忽略,我必须手动将其添加到endpointBehaviors部分。
有没有办法可以在配置文件中进行一些更改,这样每次我通过Svcutil.exe生成客户端配置和代理时,这种行为会自动包含在客户端配置文件中?
我尝试将[ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]
添加到服务界面,但它在错误中显示Attribute 'ServiceBehavior' is not valid on this declaration type. It is only valid on 'class' declarations.
答案 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。