Настройка WCF MaxItemsInObjectGraph не работает
Я получаю следующую ошибку, пытающуюся получить доступ к моей службе 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>
Это то, что находится в Client 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. Почему ни один из этих параметров не используется приложениями? Есть что-то еще, что нужно где-то установить?
Ответы
Ответ 1
Пришел ядерный и обновил этот machine.config;
Направления здесь
Суть его состоит в том, чтобы добавить в раздел "system.serviceModel" следующее.
<commonBehaviors>
<endpointBehaviors>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</endpointBehaviors>
<serviceBehaviors>
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</serviceBehaviors>
</commonBehaviors>
Ответ 2
Ты был на правильном пути!
Все, что вам нужно было сделать, это добавить имя к поведению
<behavior name="MyBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
И затем в конечной точке добавьте
<endpoint .... behaviorConfiguration="MyBehavior"/>
Ответ 3
Я написал программу для изменения конфигураций машины для этого, потому что поддержка. Это работает для меня, но я не проводил тонны тестирования.
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();
}
}
}
Ответ 4
У меня была такая же проблема, и я попробовал несколько вариантов, но нашел решение здесь:
https://msdn.microsoft.com/en-us/library/ms732038.aspx
В разделе "Управление процессом сериализации".
Добавление...
[ServiceBehavior (MaxItemsInObjectGraph = 100000)]
класс My Service...
удача
Ответ 5
У меня была такая же проблема: в возвращающемся классе было несколько перечислений. То, что выяснилось, не может быть нулевым. Проверьте, есть ли у вас какие-либо перечисления, которые должны быть возвращены.