Kanalpiroge
Hallo zusammen!
Ich arbeite mit einem WCF Service und ich habe gerade festgestellt, dass Methoden, die IList<T> zurückgeben immer schreibgeschützte Listen liefern.
Ich würde gerne auf dem Client mit den Listen arbeiten. Gibt es eine Möglichkeit, das so zu konfigurieren, dass ich veränderbare Listen erhalte? Wenn möglich möchte ich das Erstellen einer veränderbaren Kopie der Liste sparen.
Vielen Danke für entsprechende Hinweise!
Gruß,
Ralf
gfoidl
Hallo Kanalpiroge,
VS verwendet für die Generierung auf der Client-Seite standardmäßig ein System.Array (also ein T[]) für Auflistungs-Typen. Dies kann aber anders eingestellt werden. Entweder direkt beim Erstellen, indem auf "Advanced" geklickt wird od. nachher durch "Configure Service Reference". Dann im Dialog einen anderen Typ einstellen. Siehe Anhang.
Ich hoffe das ist was du gemeint hast.
Wenn die Client-Seite nicht per VS od. sonst einem Tool generiert wird, kannst du auch direkt die Assembly mit den ServiceContracts verlinken, dann hast du auch die gleichen Typen wie auf der Serverseite.
mfG Gü
Kanalpiroge
Hi gfoidl!
Danke für die Antwort!
Ich generiere die Client Seite nicht sondern erzeuge den Channel "manuell" im Quellcode.
Allerdings verlinke ich das Assembly mit den Service Contracts und ich bekomme auch die richtigen Typen. Nur sind die Listen alle samt readonly und ich kann keine Elemente hinzufügen oder entfernen.
gfoidl
Hallo Kanalpiroge,
| Zitat: |
| Allerdings verlinke ich das Assembly mit den Service Contracts (nicht den Implementierungen) und habe trotzdem nicht die selben Typen. |
Wenn du mit "verlinken" referenzieren meinst, dann musst du die gleichen Typen haben. Gleiche Assembly = gleiche Schnittstellendefinition = gleiche Typen.
Kannst du deine Solution anhängen, dann schau ich mir das an. So kann ich mir nicht viel unter dem Problem vorstellen.
mfG Gü
Kanalpiroge
Hups... jetzt hatte ich den Beitrag versehentlich abgeschickt und während Du geantwortet hast noch mal überarbeitet.
Ich habe es auch mal mit dem NetDataContractSerializer probiert und das funktioniert.
Die komplette Solution kann ich leider nicht anhängen. Müsste dann ein kleines Beispiel erstellen, das ich herausgeben kann... aber es läuft ja so, wie 's jetzt ist. Auch wenn ich das Verhalten ohne NetDataContractSerializer nach wie vor etwas eigenartig finde.
gfoidl
Hallo Kanalpiroge,
kein Problem.
Ich verstehe nur nicht was du mit readonly Listen meinst. Wenn du eine IList<T> bekommst, so kann die Add-Methode aufgerufen werden od. nicht?
mfG Gü
gfoidl
Hallo Kanalpiroge,
dass es tatsächlich so ist wusste ich bisher noch gar nicht. Ich hab das eben probiert und du hast recht (nicht dass ich daran gezweifelt habe, sondern ich konnte es einfach nicht nachvollziehen).
Es scheint als ob WCF (bzw. genauer der standardmäßige Serialisierer) allgemein Auflistungstypen (IList<T>, ICollection<T>) als T[] überträgt und dieses ist indem Sinne readonly, dass bei einem Array keine Elemente hinzugefügt werden können. Indizierter Zugriff auf die Elemente ist ganz normal möglich.
Wenn im ServiceContract statt IList<T> ein konkreter Typ wie List<T> verwendet, so gehts wie erwartet.
Der NetDataContractSerializer ist hier schlauer und überträgt auch den konkreten Typen. Wenn also z.B. folgende Service-Methode aufgerufen wird:
C#-Code: |
public IList<int> GetACollection()
{
return Enumerable.Range(0, 10).ToList();
}
|
So weiß der NetDataContractSerializer dass es sich um eine List<int> handelt und der Client kann daraus eine List<int> machen.
Andernfalls wird einfach irgendein Typ verwendet der zu IList<int> passt und der einfachste ist eben int[] - dieser wird auf dem Client erzeugt und somit ist diese Collection readonly.
mfG Gü
Kanalpiroge
Tja... dann bleibt's wohl bei dem Net...Serializer... schade, dass es nicht einfacher geht.
Konnte ja keiner ahnen, dass WCF so sensibel auf Interfaces reagiert... zumal die ja bevorzugt verwendet werden sollten, wenn möglich... naja...
Danke für die Hilfe! :)
gfoidl
Hallo Kanalpiroge,
| Zitat: |
| schade, dass es nicht einfacher geht. |
durch Verwendung von explizit z.B. List<T> gehts. Du hast schon recht, dass möglichst immer Interfaces zurückgegeben werden, hier würde ich das aber als Ausnahme von der Regel betrachten.
mfG Gü