【问题标题】:set maxItemsInObjectGraph in client config在客户端配置中设置 maxItemsInObjectGraph
【发布时间】:2011-06-08 17:48:36
【问题描述】:

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

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

我尝试将 [ServiceBehavior(MaxItemsInObjectGraph = 2147483647)] 添加到服务接口,但它给了我一个错误提示 Attribute 'ServiceBehavior' is not valid on this declaration type. It is only valid on 'class' declarations.

【问题讨论】:

    标签: wcf wcf-binding


    【解决方案1】:

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

    您基本上有 2 个选择:每次生成时更新客户端配置,或者在代码中,当您创建代理类的实例时,更新 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 获得 Endpoint。

    【讨论】:

    • 这是一个很好的解决方法,由于某种原因我的 app.config 没有监听我的 xml 方向,所以这是我最好的选择。
    • 我整天都在为此苦苦挣扎,这是解决问题的唯一解决方案。真诚的感谢!
    【解决方案2】:

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

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

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

    通用行为被添加到机器上运行的每个服务/端点。这可能对开发有好处,但你不能忘记,一旦你准备好用于生产的包,你将不得不将此配置添加到生产的配置文件中 - 因为最好持续维护这样的配置文件并在某些构建中使用它/测试服务器。

    【讨论】:

    • 我的主要问题是将该属性添加到每个客户端配置文件中。看来我必须忍受它。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多