Frage

Ich bin ein wenig Mühe Verständnis ServiceKnownType in WCF hat.

diesem Blog , den folgenden Code funktioniert nicht:

[DataContract(Namespace = “http://mycompany.com/”)]
public class Shape{…}

[DataContract(Namespace = “http://mycompany.com/”)]
public class Circle : Shape {…}

[ServiceContract]
public interface IMyServer
{
    [OperationContract]
    bool AddShape(Shape shape);
}

.

IMyServer client = new ChannelFactory<IMyServer>(binding, endPoint).CreateChannel();

client.AddShape(new Circle());

Der Grund, warum es nicht funktioniert, weil Sie einen Kreis hinzufügen mögen, aber der Servicekontrakt erlaubt nur eine Form. Sie sollen etwas mit knowntypes tun, aber ich bin ein wenig verwirrt darüber, wie das funktioniert.

Da dieser Code im Dienst ist, warum es nicht weiß automatisch, dass ein Kreis von Shape abgeleitet ist? Zusätzlich was macht ServiceKnownType eigentlich tun?

Wenn ServiceKnownType unterhalb des Datacontract setzen, offenbar das macht es funktionieren. Ich vermute, es sagt, hey, diese besondere Objekttyp-Form genannt kann auch ein Kreis sein. Ich habe Probleme beim Verständnis, warum es es auf diese Weise um tun würde, denn wenn man einen neuen Typ wie Quadratisch Sie die Shape-Klasse ein ServiceKnownType für ihn hinzuzufügen gehen zu müssen. Wäre es nicht sinnvoll, wenn sie es nicht entnehmen können, die Knowntype auf den Platz zu setzen, anstatt die Form? So ist der Platz hey sagt, ich bin eine Form, und Sie müssen nicht mit der Shape-Klasse Geige? Wenn Ihr Shape-Klasse in eine Bibliothek aufgebaut ist und Sie möchten Ihre eigene dervied Form wie DiamondShape erstellen, können Sie es nicht in die Shape-Klasse hinzugefügt werden, da Sie keinen Zugriff auf den Quellcode haben.

War es hilfreich?

Lösung

Das Problem ist, dass WCF geht nicht in alle Baugruppen und versucht, alle möglicherweise Untertypen von Form zu finden. Es ist auch nicht die Typinformationen übertragen (Montag, voll qualifizierte Typnamen) mit dem XML-Dokument.

So, während es kein Problem sein würde, einen Tag „Circle“ auf der abgehenden XML, die eingehenden deserializater wissen würden nicht zu erzeugen, was damit zu tun.

Die Knowntype „Hack“ ist wie eine Registrierung von bekannten Typen, die von beiden Seiten umgesetzt werden muss. Es ist explizit. Mit dieser Registrierung, weiß der Deserializer, dass „Circle“ deserialisiert X zu geben, ohne jede Chance von ambiquity und ohne alle verfügbaren oder erreichbar Baugruppen für abgeleitete Typen zu analysieren.

Denken Sie daran, nicht Platz nicht sagen: „Ich bin eine Form“, kommt es als XML-Tag und von dem man nicht so leicht tun und automatisch wissen, welche .NET-Klasse zu verwenden.

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