Frage

In einem Web-Service-Kontext habe ich die folgende Klasse, die von der Klasse Mammal erben. Die Säugetier-Klasse wird in einem Proxy definiert. Ich kann nicht die Definition dieser Klasse ändern. Da muß ich einige Methoden zur Klasse Säugetiere auf der Client-Seite hinzufügen, ich geerbt Säugetier und erstellt Giraffe.

namespace TestApplication
{  
    public class Giraffe : Mammal
    {
        public Giraffe()
        {
        }
    }
}

Wenn ich eine WebMethod nennen, die ein Objekt vom Typ Säugetiere erwarten, erhalte ich die folgende Ausnahme mir zu sagen, dass Giraffe ist nicht zu erwarten.

  Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o)
   --- End of inner exception stack trace ---

Gibt es eine Abhilfe das? Ich kann die XmlInclude nicht wirklich hinzufügen ...

War es hilfreich?

Lösung

Methoden hinzuzufügen, sollten Sie mit partiellen Klassen sein. Versuchen Sie, eine zweite Klasse-Datei hinzufügen mit (im rechten Namensraum usw.):

partial class Mammal {
    public void ExtraMethod() {...}
}

Das partial Schlüsselwort sagt der Compiler die Klasse zu ermöglichen, mehrere Dateien aufgeteilt werden über - ideal für Code-Generation-Szenarien. Sie räumt jedoch ein, fordert das partial Schlüsselwort in jeder Datei; die Mitglieder einfach kombiniert (mit Ausnahme des Teil Methoden in C # 3.0, die ihre eigenen subtilen Verhalten haben). I Hoffnung , dass wsdl.exe (oder was auch immer) schließt dies!

Andere Tipps

Wenn Sie nur auf eine Klasse Methoden hinzufügen möchten Sie nicht ändern können, nur Erweiterungsmethoden erstellen.

public static class MammalExt {
public static void ExtraMethod(this Mammal mammal) {...}}

Obwohl, wenn Säuger ein Proxy generiert Klasse ist, sollte es eine Teilklasse sein.

Sie haben XmlInclude zu verwenden. Es ist die einzige Wahl. Sie haben die Serializer zu sagen, welche Klasse Sie werden Serialisierung, da sie den Code zu generieren hat die Serialisierung zu tun.

Es fiel mir nur während ich dies schreibe, dass Sie weg bekommen könnte mit mit Giraffe IXmlSerializable implementieren, aber das ist noch mehr Arbeit.

Die richtige Antwort ist in der Tat eine partielle Klasse zu verwenden. Wenn Sie das Client-Projekt öffnen und eine Web-Referenz generieren, analysiert Visual Studio die WSDL und erzeugt eine Klasse namens Mammal für Sie. Diese Klasse ist nur sichtbar für das Client-Projekt, so dass Sie nicht über die Server-Seite der Dinge zu kümmern.

Angenommen, Sie eine Web-Referenz namens MyWebService. Dann wird es eine Klasse sein MyWebService.Mammal genannt. Um Mitglieder zu dieser Klasse hinzufügen, alles, was Sie tun müssen, ist eine neue Quelldatei mit dieser erstellen:

namespace MyWebService {
    public partial class Mammal {
        public void ExtraMethod() { ... }
    }
}

Wenn Sie eine Methode auf Ihrem Web-Service aufrufen, die eine Mammal zurückkehrt, wird das Web Referenzcode eine neue Instanz der „verbesserten“ Säugetier-Klasse erstellen und die Werte aus dem XML auf den Draht zu der Instanz kopieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top