WCF MaxItemsInObjectGraph设置不起作用

时间:2013-07-12 19:13:53

标签: wcf-configuration

尝试访问我的WCF服务时出现以下错误。

  

'对象图中可序列化或反序列化的最大项数为“65536”。更改对象图或增加MaxItemsInObjectGraph配额

做一些研究,看起来我需要做的就是将此设置更新为更高的值。这是我想要做的,但设置似乎没有从配置中读取。我一直得到65536值的相同异常。

我按照Link的说明进行操作,但没有运气。

这是我在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值。为什么应用程序不使用这些设置?是否还需要在某处设置其他内容?

5 个答案:

答案 0 :(得分:8)

你走在正确的轨道上! 您所要做的就是为行为添加名称

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

然后在结束点添加

<endpoint .... behaviorConfiguration="MyBehavior"/>

答案 1 :(得分:5)

必须去核并更新那台机器.config;

Directions Here

它的要点是将以下内容添加到“system.serviceModel”部分。

    <commonBehaviors>
      <endpointBehaviors>
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </endpointBehaviors>
      <serviceBehaviors>
         <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </serviceBehaviors>
    </commonBehaviors>

答案 2 :(得分: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();
        }
    }
}

答案 3 :(得分:0)

我有同样的问题并尝试了几个选项,但我在这里找到了解决方案: https://msdn.microsoft.com/en-us/library/ms732038.aspx

在“控制序列化过程”中。

添加...

[ServiceBehavior(MaxItemsInObjectGraph = 100000)] 我的服务......

祝你好运

答案 4 :(得分:0)

我有同样的问题,返回课堂时有一些枚举。什么发现他们不能为空。检查您是否有任何要返回的枚举。