8

WCF サービスを使用してデータベースと通信する Silverlight 3.0 アプリケーションがあり、サービス メソッドから大量のデータが返されると、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")));
4

3 に答える 3

28

バインディングでは定義されていませんが、サービスの動作で定義されています。

Silveright では、maxItemsInObjectGraph のデフォルトは int.MaxValue です。

Silverlight ではなく .NET アプリケーション用に変更する方法に関する記事を次に示します。

コードのスニペット:

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;
}
于 2010-03-18T23:15:47.543 に答える
3

以下は、から継承するクライアントオブジェクト内で使用した関数です。

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

私は通常、オブジェクトのコンストラクターでそれを呼び出します。

于 2011-10-26T03:23:40.930 に答える
1

各エンドポイントの WCF サービスで maxItemsInObjectGraph を変更します。Silverlight で変更すると、クライアントは動作をサポートできるようになりますが、サービスもそれをサポートする必要があります。

サービスで変更した後、プロキシ/更新 Web サービスを再生成すると、新しい maxItemsInObjectGraph 値を含む新しい ServiceReference.config が取得されます。

于 2010-03-19T17:57:55.533 に答える