maxItemsInObjectGraph игнорируется - PullRequest
7 голосов
/ 24 февраля 2010

У меня проблема с сервисом WCF, который пытается сериализовать слишком много данных. По трассировке я получаю сообщение об ошибке, которое говорит о том, что максимальное количество элементов, которые можно сериализовать или не сериализовать, равно «65536», попробуйте увеличить квоту MaxItemsInObjectGraph.

Итак, я пошел и изменил это значение, но оно просто игнорируется (ошибка та же, с тем же номером). Все это на стороне сервера. На данный момент я звоню в сервис через wget.

Мой веб-конфиг выглядит так:

<system.serviceModel>  
  <behaviors>
   <serviceBehaviors>
    <behavior name="AlgoMap.Web.MapService.MapServiceBehavior">
       <dataContractSerializer maxItemsInObjectGraph="131072" />
       <serviceMetadata httpGetEnabled="true" />
       <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <bindings>
   <customBinding>
    <binding name="customBinding0" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:02:00">
      <binaryMessageEncoding>
        <readerQuotas maxDepth="64" maxStringContentLength="16384"
                                maxArrayLength="16384" maxBytesPerRead="16384"
                                maxNameTableCharCount="16384" />
      </binaryMessageEncoding>
      <httpTransport />
    </binding>
   </customBinding>
  </bindings>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service behaviorConfiguration="AlgoMap.Web.MapService.MapServiceBehavior"
    name="AlgoMap.Web.MapService.MapService">
    <endpoint address="" binding="customBinding" bindingConfiguration="customBinding0"
     contract="AlgoMap.Web.MapService.MapService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>
  </services>
 </system.serviceModel>



Версия 2, тоже не работает:

 <system.serviceModel>  
  <behaviors>

    <endpointBehaviors>
      <behavior name="AlgoMap.Web.MapService.MapServiceEndpointBehavior">
         <dataContractSerializer maxItemsInObjectGraph="131072" />
      </behavior>
    </endpointBehaviors>

   <serviceBehaviors>
    <behavior name="AlgoMap.Web.MapService.MapServiceBehavior">
       <serviceMetadata httpGetEnabled="true" />
       <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <bindings>
   <customBinding>
    <binding name="customBinding0" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:02:00">
      <binaryMessageEncoding>
        <readerQuotas maxDepth="64" maxStringContentLength="16384"
                                maxArrayLength="16384" maxBytesPerRead="16384"
                                maxNameTableCharCount="16384" />
      </binaryMessageEncoding>
      <httpTransport />
    </binding>
   </customBinding>
  </bindings>

  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service behaviorConfiguration="AlgoMap.Web.MapService.MapServiceBehavior"
    name="AlgoMap.Web.MapService.MapService">
     <endpoint 
        address="" binding="customBinding" bindingConfiguration="customBinding0"
        contract="AlgoMap.Web.MapService.MapService" 
        behaviorConfiguration="AlgoMap.Web.MapService.MapServiceEndpointBehavior" />
    <endpoint 
        address="mex" binding="mexHttpBinding" contract="IMetadataExchange"  
        behaviorConfiguration="AlgoMap.Web.MapService.MapServiceEndpointBehavior" />
   </service>
  </services>
 </system.serviceModel>

Может кто-нибудь помочь ?? Спасибо !!

Ответы [ 5 ]

10 голосов
/ 20 мая 2010

Все настройки, помещенные в web.config, были успешно проигнорированы, я не выяснил почему. Но я нашел обходной путь, то есть поместить MaxItemsInObjectGraph как украшение класса . Это работает безупречно:

// MyService.svc
// using...

namespace MyNamespace {
  [ServiceContract]
  [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  [ServiceBehavior(MaxItemsInObjectGraph = 65536000)]
  public class MyWebService {

    [OperationContract]
    [WebGet(UriTemplate = "tree/{sessionId}", ResponseFormat = WebMessageFormat.Json)]
    public MyData GetTree(string sessionId) {
    ...
...
3 голосов
/ 16 декабря 2010

Я тоже столкнулся с этим, в моем случае я забыл поместить этот параметр в мой файл app.config клиента.

1 голос
/ 09 сентября 2011

У меня та же проблема. Использование атрибута поведения службы на уровне класса работает нормально, что имеет смысл. Я предпочитаю изменение уровня конфигурации. Я добавил записи конфигурации как на клиенте (web.config), так и на уровне обслуживания (app.config). Это сработало для вас?

1 голос
/ 24 февраля 2010

Из небольшого поиска в Google кажется, что вы добавляете настройки не в том месте.

Необходимо создать новый behavior в разделе endPointBehaviors (не serviceBehaviors).

1 голос
/ 24 февраля 2010

Может быть, он еще маленький? Вы пытались дать большее значение, как 655360000? Обратите внимание, что вы должны изменить значение в конфигурационных файлах клиента и сервера. Я думаю, что вы изменились только в одной части;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...