Настройка 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

У меня была такая же проблема: в возвращающемся классе было несколько перечислений. То, что выяснилось, не может быть нулевым. Проверьте, есть ли у вас какие-либо перечисления, которые должны быть возвращены.