10

WCF サービスにアクセスしようとすると、次のエラーが発生します。

オブジェクト グラフでシリアライズまたはデシリアライズできるアイテムの最大数は '65536' です。オブジェクト グラフを変更するか、MaxItemsInObjectGraph クォータを増やします

調査を行ったところ、この設定をより高い値に更新するだけでよいようです。これは私がやろうとしていることですが、設定が構成から読み取られていないようです。値が 65536 の同じ例外が引き続き発生します。

このリンクにある指示に従いましたが、うまくいきません。

これは、WCF サービスの Web.Config で構成したものです。

    <behaviors>
        <serviceBehaviors>
            <behavior name="metadataBehavior">
                <serviceMetadata httpGetEnabled="true"  httpGetUrl="" />
                <serviceDebug includeExceptionDetailInFaults="false" />
                <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>

これは、クライアントの app.config にあるものです。

        <behaviors>
        <serviceBehaviors>
            <behavior>
                <serviceMetadata httpGetEnabled="True" />
                <serviceDebug includeExceptionDetailInFaults="False" />
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior >
                <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
            </behavior>
        </endpointBehaviors>
    </behaviors>

最後に、WCF サービス自体に次の属性があります。

[ServiceBehavior(MaxItemsInObjectGraph = 2147483646, IncludeExceptionDetailInFaults = true)]

上記の構成にもかかわらず、65536 値について不平を言う例外が引き続き発生します。これらの設定がアプリケーションで使用されないのはなぜですか? 他にどこかに設定する必要があるものはありますか?

4

5 に答える 5

8

あなたは正しい軌道に乗っていました!あなたがしなければならなかったのは、動作に名前を追加することだけでした

<behavior name="MyBehavior">
    <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
 </behavior>

そして、エンドポイントに追加します

<endpoint .... behaviorConfiguration="MyBehavior"/>
于 2014-06-06T07:26:07.057 に答える
0

私は同じ問題を抱えていました。返すクラスにいくつかの列挙型がありました。それらがnullにならないことがわかったのは何ですか。返される Enum があるかどうかを確認します。

于 2015-01-24T00:23:40.450 に答える
0

サポートされているため、このためにマシン構成を変更するプログラムを作成しました。それは私にとってはうまくいきますが、たくさんのテストを行っていません。

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

namespace FixMachineConfigBehavior
{
    class Program
    {
        public static XElement IfNotExistsAdd(XDocument xd, XElement rootElement, string childName, XElement newChild)
        {
            if (rootElement.Elements(childName).Count() == 0)
            {
                Console.WriteLine("  adding " + childName + " node...");
                rootElement.Add(newChild);
            }

            return rootElement.Element(childName);
        }

        static void Main(string[] args)
        {
            foreach (var file in Directory.EnumerateFiles(Environment.GetEnvironmentVariable("windir") + @"\Microsoft.NET\","machine.config",SearchOption.AllDirectories))
            {
                Console.WriteLine("fixing: " + file);

                TimeSpan t = DateTime.UtcNow - new DateTime(1970, 1, 1);
                double ms = t.TotalMilliseconds;

                File.Copy(file, file + "." + ms + ".bak", true);

                var xd = XDocument.Load(file);

                XElement i = xd.Root;
                i = IfNotExistsAdd(xd, i, "system.serviceModel", new XElement("system.serviceModel"));
                i = IfNotExistsAdd(xd, i, "commonBehaviors", new XElement("commonBehaviors"));
                i = IfNotExistsAdd(xd, i, "endpointBehaviors", new XElement("endpointBehaviors"));
                i = IfNotExistsAdd(xd, i, "dataContractSerializer", new XElement("dataContractSerializer", new XAttribute("maxItemsInObjectGraph", Int32.MaxValue)));

                xd.Save(file);
            }

            Console.ReadLine();
        }
    }
}
于 2014-08-01T14:38:55.720 に答える
0

同じ問題があり、いくつかのオプションを試しましたが、ここで解決策を見つけました: https://msdn.microsoft.com/en-us/library/ms732038.aspx

「シリアル化プロセスの制御」。

追加中...

[ServiceBehavior(MaxItemsInObjectGraph=100000)] クラス マイ サービス ...

幸運を

于 2015-01-23T18:28:04.810 に答える