尝试访问我的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值。为什么应用程序不使用这些设置?是否还需要在某处设置其他内容?
答案 0 :(得分:8)
你走在正确的轨道上! 您所要做的就是为行为添加名称
<behavior name="MyBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
然后在结束点添加
<endpoint .... behaviorConfiguration="MyBehavior"/>
答案 1 :(得分:5)
必须去核并更新那台机器.config;
它的要点是将以下内容添加到“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)
我有同样的问题,返回课堂时有一些枚举。什么发现他们不能为空。检查您是否有任何要返回的枚举。