2010-02-24 14 views
7

Ich habe ein Problem mit einem WCF-Dienst, der versucht, zu viele Daten zu serialisieren. Von der Ablaufverfolgung erhalte ich einen Fehler, der besagt, dass die maximale Anzahl von Elementen, die serialisiert oder unserialisiert werden können, 65536 ist. Versuchen Sie, das MaxItemsInObjectGraph-Kontingent zu erhöhen.maxItemsInObjectGraph ignoriert

Also ich ging und änderte diesen Wert, aber es wird einfach ignoriert (der Fehler ist der gleiche, mit der gleichen Nummer). All das ist Server-Seite. Ich rufe den Dienst über wget für den Moment an.

Meine Web-Config ist wie folgt:

<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, nicht funktioniert entweder:

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

Kann mir jemand helfen ?? Danke !!

+2

Sie müssen es auch in der Client-Konfiguration einstellen. – flayn

Antwort

10

Alle Einstellungen in der web.config wurden gerne ignoriert, ich habe nicht herausgefunden warum. Aber ich habe einen Workaround gefunden, das heißt, die MaxItemsInObjectGraph als Klasse Dekoration setzen. Das funktioniert einwandfrei:

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

Das ist richtig! Endlich Antwort, die ich gesucht habe ... – zidane

+0

Ich habe diese Antwort seit 8 Stunden gesucht, sehr geschätzt. – BryanGrimes

1

Vielleicht ist es noch klein? hast du versucht, einen größeren Wert wie 655360000 zu geben? Beachten Sie, dass Sie den Wert in den Konfigurationsdateien des Clients und des Servers ändern sollten. Meine Vermutung ist, dass Sie nur in einem Teil geändert haben;)

+2

Nein, es ist nicht klein, es wird nur vom Server IGNORIERT. In der Ausnahme sehe ich immer noch das Standardlimit. Ich habe keine clientseitige Konfiguration, da ich diese über wget anrufe, und im fertigen Produkt werde ich sie mit einem WebClient aufrufen. – Palantir

1

Von einer kleinen Suche in Google scheint es, dass Sie die Einstellung an der falschen Stelle hinzufügen.

Sie müssen einen neuen behavior im Abschnitt endPointBehaviors erstellen (nicht serviceBehaviors).

+0

Versucht, aber mit den gleichen Ergebnissen. Ich habe die neue Konfiguration in die Frage gestellt ... – Palantir

3

ich in diese lief so gut, in meinem Fall hatte ich in meinem Klienten app.config Datei diese Einstellung vergessen haben, zu platzieren.

1

Ich habe das gleiche Problem. Das Verwenden des Dienstverhaltenattributs auf Klassenebene funktioniert gut, was sinnvoll ist. Ich bevorzuge die Änderung der Konfigurationsstufe. Ich habe die Konfigurationseinträge sowohl auf dem Client (web.config) als auch auf der Serviceebene (app.config) hinzugefügt. Hat das für dich funktioniert?