【问题标题】:How can I set the maxItemsInObjectGraph property programmatically from a Silverlight Application?如何从 Silverlight 应用程序以编程方式设置 maxItemsInObjectGraph 属性?
【发布时间】:2010-03-18 21:59:20
【问题描述】:

我有一个 Silverlight 3.0 应用程序,它使用 WCF 服务与数据库进行通信,当我从服务方法返回大量数据时,我收到 Service Not Found 错误。我相当有信心,它的解决方案是简单地更新 maxItemsInObjectGraph 属性,但我正在以编程方式创建服务客户端并且找不到设置此属性的位置。这是我现在正在做的事情:

BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None)
{
    MaxReceivedMessageSize = int.MaxValue,                  
    MaxBufferSize = int.MaxValue
};                        

MyService.MyServiceServiceClient client = new MyService.MyServiceProxyServiceClient(binding, new EndpointAddress(new Uri(Application.Current.Host.Source, "../MyService.svc")));

【问题讨论】:

    标签: wcf .net-3.5 silverlight-3.0 wcf-client


    【解决方案1】:

    它不是在绑定中定义的,而是在服务行为中定义的。

    在 Silveright 中,maxItemsInObjectGraph 默认为 int.MaxValue。

    这是一篇关于如何为 .NET 应用程序更改它的文章,但不是 Silverlight:Programattically setting the MaxItemsInObjectGraph property in client

    一个sn-p的代码:

    protected ISecurityAdministrationService GetSecAdminClient()
    {
         ChannelFactory<ISecurityAdministrationService> factory = new    ChannelFactory<ISecurityAdministrationService>(wsSecAdminBinding, SecAdminEndpointAddress);
         foreach (OperationDescription op in factory.Endpoint.Contract.Operations)
         {
           DataContractSerializerOperationBehavior dataContractBehavior =op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior;
           if (dataContractBehavior != null)
           {
                 dataContractBehavior.MaxItemsInObjectGraph = 2147483647;
           }
         }
        ISecurityAdministrationService client = factory.CreateChannel();
        return client;
    }
    

    【讨论】:

    • 我看过了,但由于某种原因 OperationDescription 没有 Behaviors 属性。
    • 我明白了。我猜是因为客户端是 Silverilght 应用程序,所以 System.ServiceModel.dll 与 .NET 不同。但是 Silverlight 上的 DataContractSerializer maxItemsInObjectGraph 默认为 int.MaxValue。您要在代码中将其设置为较小的值吗?
    • 没有。也许这是我的一个误解,但我认为它的默认值远低于 int.MaxValue。我有使用 WCF 服务的 aspx 页面并遇到类似问题,我能够将 web.config 中的 maxItemsInObjectGraph 修改为 2147483646 并解决了问题。
    • 事实证明你是对的,没有必要这样做,因为在 Silverlight 中它默认为 int.maxValue
    • 谢谢!!!。我不认为你需要“作为 DataContractSerializerOperationBehavior”,但 Find 已经返回了强制类型。
    【解决方案2】:

    以下是我在继承自的客户端对象中使用的函数

    System.ServiceModel.ClientBase(Of IServiceName)
    

    该方法的目的是以编程方式为每个操作设置 MaxItemsInObjectGraph 值。这让我可以拥有更复杂的结构。

        Private Sub IncreaseObjectCount()
            For Each op As System.ServiceModel.Description.OperationDescription In Me.Endpoint.Contract.Operations
                For Each dscob As System.ServiceModel.Description.DataContractSerializerOperationBehavior In op.Behaviors.FindAll(Of System.ServiceModel.Description.DataContractSerializerOperationBehavior)()
                    dcsob.MaxItemsInObjectGraph = Integer.MaxValue
                Next dcsob
            Next op
        End Sub
    

    我通常在对象的构造函数中调用它。

    【讨论】:

      【解决方案3】:

      在 WCF 服务中为每个端点更改 maxItemsInObjectGraph,在 Silverlight 中更改它意味着客户端将能够支持该行为,但服务也必须支持它。

      在您的服务中更改它后,重新生成代理/更新 Web 服务,您将获得一个新的 ServiceReference.config,其中将包含新的 maxItemsInObjectGraph 值

      【讨论】:

      • 服务已更新。问题是当我在代码中设置客户端时,所有放入 ServiceReference.config 的设置都会被忽略。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 2021-06-22
      • 2023-01-03
      • 1970-01-01
      • 2012-08-20
      • 2021-05-20
      相关资源
      最近更新 更多