none
Webサービスプログラムで、MaxItemsInObjectGraphの値を変更したい

    質問

  • いつもお世話になっております。

    C#3.0でWebサービスプログラムを開発しています。
    そこで、次のような例外が発生しました。

    ********************************************************************************************************************
    System.ServiceModel.Dispatcher.NetDispatcherFaultException

    メッセージ パラメータ http://tempuri.org/:xxxxxxxxxxResponse をシリアル化解除しようとしているときにエラーが発生しました。
    InnerException メッセージは '1 つのオブジェクト グラフ内でシリアル化が可能な項目の最大数、
    またはシリアル化の解除が可能な項目の最大数は '65536' です。
    オブジェクト グラフを変更するか、MaxItemsInObjectGraph クォータを増やしてください。 ' でした。
    詳細については InnerException を参照してください。
     のシリアル化を解除しようとしているときに、フォーマッタから例外がスローされました
    ********************************************************************************************************************

    エラーメッセージを見てMaxItemsInObjectGraphのサイズを変更しようと考えました。
    そこで問題のWebサービスのクラスに対して次のようにプログラムしました。

    using System.ServiceModel;

    namespace xxxxxxxxxx
    {
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。
        // [System.Web.Script.Services.ScriptService]
        [ServiceContract]
        [ServiceBehavior(MaxItemsInObjectGraph = 2147483647)]
        public class xxxxxService : System.Web.Services.WebService
        {

        }
    }

    とりあえず値は極端に大きくしてみたのですが、
    結果が変わりませんでした。

    MaxItemsInObjectGraphを変更する方法を間違えていると思うのですが、
    どのようにプログラムすれば良いのでしょうか?

    もしご存知でしたらご教示頂けませんか?
    よろしくお願い致します。

    2010年10月7日 3:50

回答

  • MaxItemsInObjectGraph はクライアントのエンドポイントビヘイビアで設定できます。下記の手順を試してみてください。

    1. WCF サービス構成エディターでapp.configを開く
    2. [詳細設定]-[エンドポイント動作]で[新しいエンドポイント動作の構成]を実行
    3. [動的要素の拡張の位置]で[追加]をクリック
    4. ダイアログの一覧から[dataContractSerializer]を選んで追加
    5. ツリーに追加されたdataContractSerializerを選択
    6. MaxItemsInObjectGraphの値を変更
    7. [クライアント]-[エンドポイント]下にあるエンドポイントを選択
    8. BehaviorConfigurationに先ほど作成したエンドポイント動作を指定
    9. 保存

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク リオ 2010年10月8日 7:41
    2010年10月8日 0:05

すべての返信

  • クライアント側で、サービスから帰ってきた値をシリアル化解除しようとして失敗しているようです。クライアント側の MaxItemsInObjectGraph を変更すると解決する可能性があります。

    WCF サービスを呼び出すクライアントクラスは、サービス参照で生成されたものでしょうか?

    サービス参照で生成されたものなら、クライアントのプロジェクトの app.config ファイルに WCF 構成が記述されていると思います。WCF サービス構成エディターを使って、MaxItemsInObjectGraph の値を変更すればいいです。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月7日 5:40
  • なかむら様

    ご回答ありがとうございます。

    > クライアント側で、サービスから帰ってきた値をシリアル化解除しようとして失敗しているようです。クライアント側の MaxItemsInObjectGraph を変更すると解決する可能性があります。
    クライアント側の設定を変更する必要があったのですね。
    うまく理解できなくてサーバー側なのだろうかと勘違いしておりました。

    > WCF サービスを呼び出すクライアントクラスは、サービス参照で生成されたものでしょうか?
    はい、そうです。

    > サービス参照で生成されたものなら、クライアントのプロジェクトの app.config ファイルに WCF 構成が記述されていると思います。WCF サービス構成エディターを使って、MaxItemsInObjectGraph の値を変更すればいいです。
    ありがとうございます。
    早速やってみました。

    Visual Studio 2008から[ツール]⇒[WCF サービス構成エディター]を開きまして、
    [ファイル]⇒[開く]⇒[構成ファイル]から[app.confog]を開きました。
    問題のサービス(xxxSoap)の設定値の中に「MaxItemsInObjectGraph」があるのだろうか
    と思い[バインド]フォルダ内のSoapを選択したり、[クライアント]⇒[エンドポイント]の中のSoapを選択したり
    してみたのですが、「MaxItemsInObjectGraph」という項目を見付けられませんでした。

    とても詳しくご説明頂いていながら解決できずに申し訳ないのですが、
    もう少し詳しくご説明頂けませんか。

    ぜひよろしくお願い致します。

    2010年10月7日 8:15
  • MaxItemsInObjectGraph はクライアントのエンドポイントビヘイビアで設定できます。下記の手順を試してみてください。

    1. WCF サービス構成エディターでapp.configを開く
    2. [詳細設定]-[エンドポイント動作]で[新しいエンドポイント動作の構成]を実行
    3. [動的要素の拡張の位置]で[追加]をクリック
    4. ダイアログの一覧から[dataContractSerializer]を選んで追加
    5. ツリーに追加されたdataContractSerializerを選択
    6. MaxItemsInObjectGraphの値を変更
    7. [クライアント]-[エンドポイント]下にあるエンドポイントを選択
    8. BehaviorConfigurationに先ほど作成したエンドポイント動作を指定
    9. 保存

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク リオ 2010年10月8日 7:41
    2010年10月8日 0:05
  • なかむら様

    ご回答ありがとうございました。

    教えて頂いた方法でapp.configを変更したところ、
    問題を解決することができました。

    サービスから受信したデータのサイズが大きいために
    今回の例外が発生したと考えるのが良いのでしょうか?
    (SQLのSELECT文の結果を受信しています。)
    (SELECT文を変えて受信件数を減らしたら、例外は発生しませんでした。)

    非常に助かりました。
    ありがとうございました。

    以上、よろしくお願い致します。

    2010年10月8日 7:41