Probleme mit WCF



  • Hallo Leute,

    ich sitzte schon seit Tagen an einem (wahrscheinlich) simplen Problem. Ich habe mal einen kleinen Service erstellt der Beispielhaft mein Problem beschreibt.
    Ich habe einen WCF Service der nur aus einer Funktion besteht der GetData. Es handelt sich hierbei im die die VS 2010 standartmäßig anlegt. Ich habe das ganze nur dahingehend abgeändert das kein string mehr zurückgegeben wird sondern ein List Obj. Hier mal der Code.

    public class Service1 : IService1
        {
            public List<MyContainer> GetData(int value)
            {
                List<MyContainer> result = new List<MyContainer>();
                for (int i = 1; i <= value; i++)
                {
                    MyContainer con = new MyContainer();
                    con.Name = "Maier";
                    con.Vorame = "Horst";
                    con.Zahl = i;
    
                    result.Add(con);
                }
    
                return result;
            }
    

    Und hier mal das Obj MyContainer im Interface

    [ServiceContract]
        public interface IService1
        {
    
            [OperationContract]
            List<MyContainer> GetData(int value);
    
            // TODO: Hier Dienstvorgänge hinzufügen
        }
    
        // Verwenden Sie einen Datenvertrag, wie im folgenden Beispiel dargestellt, um Dienstvorgängen zusammengesetzte Typen hinzuzufügen.
    
        [DataContract]
        public class MyContainer
        {
            [DataMember]
            public string Name { get; set; }
            [DataMember]
            public string Vorame { get; set; }
            [DataMember]
            public int Zahl { get; set; }
        }
    

    Noch damit es komplett ist die Web.config. Ist aber unverändert.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>    
        <behaviors>      
          <serviceBehaviors>        
            <behavior>          
              <!-- Legen Sie den Wert unten auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden, und entfernen Sie den Metadatenendpunkt oben vor der Bereitstellung. -->
              <serviceMetadata httpGetEnabled="true"/>
              <!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
      </system.serviceModel>
     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
    
    </configuration>
    

    Wie ihr seht ist bis dahin von mir nicht viel verädert worden. GetData rufe ich jetzt mit der Anzahl der Datensätze auf die ich zurück haben will. Das ganze geht auch bis dahin wo ich die 16500 nicht überschreite.
    Wenn ich das (z.B. mit dem WCF-Tester vom VS 2010 oder einem eigenen Client) teste bekomme ich immer die Meldung :

    Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung wurde unerwartet getrennt..
    

    Ich habe jetzt lange zeit in die Max Nachrichtengröße geforscht, aber leider ohne einen Erfolg. Auch habe ich beim testen mit dem WCF-Testclient immer in der Config die maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" gesetzt.

    Ich komme einfach nicht weiter und weiß nicht wo mein Problem ist. Für alle die sich jetzt fragen, welchen Sinn macht dieser Service. Keinen. Er soll einfach mein Problem beschreiben ohne das ich jetzt mega Postings machen muß.

    Vielleicht hat irgendjemand einen Hinweis oder weiß sogar die Antwort warum sich das so verhält.

    Danke an alle schonmal vorab



  • Du könntest in der Konfig mal das Tracing einschalten und dir die Nachrichten ansehen:

    http://msdn.microsoft.com/en-us/library/ms733025.aspx

    Manchmal stecken da Informationen drin, die einem weiterhelfen.



  • OK. Jetzt habe ich mal das Logging in der config aktiviert. Da wird ja so viel geloggd das man denken sollte das was sinnvolles dabei ist aber bisher nix.
    Außer das:

    Der Inhaltstyp "application/soap+xml; charset=utf-8" wurde an einen Dienst gesendet, der "text/xml; charset=utf-8" erwartet. Möglicherweise stimmen Client- und Dienstbindungen nicht überein.</
    

    Aber über den Sinn läst sich streiten da der Service ja geht, solange die Antwort nicht mehr als 16200 Zeilen hat. ?

    Ohh. Habe nochwas.

    Fehler beim Deserialisieren von Parameter http://tempuri.org/:GetDataResult. Die InnerException-Nachricht war "Die maximale Anzahl der Elemente in einem Objektgraph, die serialisiert bzw. deserialisiert werden können, beträgt "65536". Ändern Sie den Objektgraph oder erhöhen Sie das MaxItemsInObjectGraph-Kontingent. ".  Weitere Details finden Sie unter "InnerException".
    

    Die InnerException sagt das gleiche. Ich weiß zwar nicht wie die Zahl 65536 mit 16200 Zeilen zusammenhängt aber vielleicht hat ja jemand vonb euch einen Tip

    Danke schonmal für den Loggintip



  • Das Problem ist gelöst.
    Es war tasächlich der <dataContractSerializer maxItemsInObjectGraph="2147483647"/> im serviceBehavior der gesetzt werden mußte. Und schon ist diese Begrenzung aufgehoben. Auch wenn es nur ein sehr allgemeiner und waager Hinweis von PuppetMaster2k war hat es doch was gebracht.

    @PuppetMaster2k du bist mein Held.

    Mfg



  • Die Anzahl, die du "maxItemsInObjectGraph" vergeben kannst, ist die Anzahl an Bytes die gelesen werden können. Wenn also deine 16200 Zeilen, diese Anzahl überschreiten (was durchaus nicht unüblich ist), dann kommt der Serializer damit nicht mehr klar und dir fliegt halt diese Exceptions um die Ohren.



  • Ich dachte mir sowas schon und habe es deshalb mal auf 2Gig gesetzt. Auch wenn das wahrscheinlich viel zu groß ist.
    Ich danke dir für die Hilfe.


Anmelden zum Antworten