2010-02-24 3 views
7

У меня проблема с сервисом WCF, который пытается сериализовать слишком много данных. Из трассы я получаю сообщение об ошибке, в котором говорится, что максимальное количество элементов, которые могут быть сериализованы или неэтериализованы, составляет «65536», попробуйте увеличить квоту MaxItemsInObjectGraph.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> 



Version 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> 

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

+2

Вам также нужно установить его в клиентской конфигурации. – flayn

ответ

10

Любые настройки, помещенные в 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) { 
    ... 
... 
+0

Это правильно! Наконец, ответ, который я искал ... – zidane

+0

Я искал этот ответ в течение 8 часов, очень ценя. – BryanGrimes

1

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

+2

Нет, он не маленький, он просто НЕИСПРАВЛЯЕТСЯ сервером. В исключении я все еще вижу предел по умолчанию. У меня нет клиентской конфигурации, так как я вызываю это через wget, а в конечном продукте я буду называть его с помощью WebClient. – Palantir

1

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

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

+0

Пробовал это, но с теми же результатами. Я поставил новую конфигурацию в вопрос ... – Palantir

3

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

1

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