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 回答
6

不得不去核并更新那个machine.config;

路线在这里

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

    <commonBehaviors>
      <endpointBehaviors>
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </endpointBehaviors>
      <serviceBehaviors>
         <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </serviceBehaviors>
    </commonBehaviors>
于 2013-07-16T17:34:29.463 回答
0

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

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

添加...

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

祝你好运

于 2015-01-23T18:28:04.810 回答
0

我有同样的问题,返回班有一些枚举。发现它们不能为空。检查您是否有任何要返回的枚举。

于 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 回答