2010-02-24 12 views
7

Mam problem z usługą WCF, która próbuje serializować zbyt wiele danych. Na podstawie śledzenia pojawia się błąd, który mówi, że maksymalna liczba elementów, które mogą być serializowane lub niezsrializowane wynosi "65536", spróbuj zwiększyć limit MaxItemsInObjectGraph.maxItemsInObjectGraph zignorowany

Poszedłem i zmodyfikowałem tę wartość, ale jest ona po prostu ignorowana (błąd jest taki sam, z tym samym numerem). Wszystko to jest po stronie serwera. W tej chwili dzwonię do serwisu przez wget.

My Web config jest tak:

<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, nie działa albo:

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

Czy ktoś może pomóc ?? Dzięki!

+2

Należy również ustawić go w konfiguracji klienta. – flayn

Odpowiedz

10

Wszelkie ustawienia wprowadzone w pliku web.config zostały zignorowane, nie wiem dlaczego. Ale znalazłem obejście, to jest umieścić MaxItemsInObjectGraph jako dekoracja klasy. To działa bez zarzutu:

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

To prawda! Wreszcie odpowiedź, której szukałem ... – zidane

+0

Szukałem tej odpowiedzi przez 8 godzin, bardzo doceniłem. – BryanGrimes

1

Może być jeszcze mały? czy próbowałeś podać większą wartość, na przykład 655360000? Zauważ, że powinieneś zmienić wartość w plikach konfiguracyjnych klienta i serwera. Domyślam się, że zmieniłeś tylko w jednej części;)

+2

Nie, nie jest mały, jest po prostu IGNOROWANY przez serwer. W wyjątku nadal widzę limit domyślny. Nie mam żadnej konfiguracji po stronie klienta, ponieważ wywołuję to przez wget, a w produkcie końcowym będę wywoływał go za pomocą WebClient. – Palantir

1

Z niewielkiej wyszukiwarki w Google wynika, że ​​dodajesz ustawienie w niewłaściwym miejscu.

Musisz utworzyć nowy behavior w sekcji endPointBehaviors (nie serviceBehaviors).

+0

Próbowałem tego, ale z tymi samymi wynikami. Wstawiłem nową konfigurację do pytania ... – Palantir

3

wpadłem na to jak dobrze, w moim przypadku, ja zapomniałem umieścić to ustawienie w moim pliku app.config klienta.

1

Mam ten sam problem. Używanie atrybutu zachowania usługi na poziomie klasy działa dobrze, co ma sens. Preferuję zmianę poziomu konfiguracji. Dodałem wpisy konfiguracyjne zarówno na kliencie (web.config), jak i na poziomie usługi (app.config). Czy to działa dla ciebie?

Powiązane problemy