2013-07-12 1 views
10

У меня была следующая ошибка при попытке получить доступ к моей службе WCF.WCF MaxItemsInObjectGraph не работает

«Максимальное количество элементов, которые могут быть сериализованы или десериализованы в графе объектов, составляет« 65536 ». Измените график объекта или увеличьте квоту MaxItemsInObjectGraph

Выполнение некоторых исследований, похоже, что все, что мне нужно сделать, - это обновить эту настройку, чтобы она была более высокой. Это то, что я пытаюсь сделать, но настройка, похоже, не считывается из конфигурации. Я продолжаю получать одно и то же исключение с его значением 65536.

Я следовал инструкциям, изложенным в этом Link, но мне не повезло.

Вот что я настроил на Web.Config службы WCF.

<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

Должен был перейти на ядерный и обновить этот файл machine.config;

Directions Here

Суть его заключается в добавлении следующего в раздел «system.serviceModel».

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

Вы были на правильном пути! Все, что вам нужно было добавить имя к поведению

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

И затем в конечной точке добавить

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

Спасибо! Сэкономил мне много времени :) –

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(); 
     } 
    } 
} 
0

У меня была такая же проблема, и попробовал несколько вариантов, но я нашел решение здесь: https://msdn.microsoft.com/en-us/library/ms732038.aspx

В «Управление процессом сериализации».

Добавления ...

[ServiceBehavior (MaxItemsInObjectGraph = 100000)] класса Моя_службы ...

удачи

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^