我在服务器配置文件中指定了maxItemsInObjectGraph,但在创建客户端配置文件时,此属性被忽略,我必须手动将其添加到endpointBehaviors部分.
有没有办法我可以在配置文件中进行一些更改,以便每次我通过Svcutil.exe生成客户端配置和代理时,此行为自动包含在客户端配置文件中?
我尝试[ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]了服务接口,但它给我一个错误说Attribute 'ServiceBehavior' is not valid on this declaration type. It is only valid on 'class' declarations.
行为通常是本地设置(您可以为客户端和服务器设置不同的值,并且通信仍然可以正常工作),因此它们不会在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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您手写客户端实现而不是使用自动生成的存根,则Endpoint可通过用于创建服务接口通道的ChannelFactory获得.
不,这是每个参与者配置的另一个行为.每个客户端都可以控制此属性,并且服务不会公开此属性,因为它可能被视为安全问题.
如果您的问题主要是关于开发(每次刷新引用时不想修改行为),您可以使用commonBehaviors只能在machine.config中定义的部分:
<commonBehaviors>
<behaviors>
<endpointBehaviors>
<dataContractSerializer maxItemsInObjectGraph="..." />
</endpointBehaviors>
</behaviors>
</commonBehaviors>
Run Code Online (Sandbox Code Playgroud)
常见行为将添加到计算机上运行的每个服务/端点.它可能对开发有好处,但你不能忘记,一旦你准备了生产包,你就必须将这个配置添加到生产的配置文件中 - 因为最好不断地维护这样的配置文件并在一些构建中使用它/测试服务器.
| 归档时间: |
|
| 查看次数: |
7931 次 |
| 最近记录: |