Question

J'ai un peu de mal à comprendre ServiceKnownType dans WCF.

ce blog , le code suivant ne fonctionne pas:

[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());

La raison pour laquelle il ne fonctionne pas parce que vous essayez d'ajouter un cercle, mais le ServiceContract permet seulement une forme. Vous êtes censé faire quelque chose avec knowntypes, mais je suis un peu confus au sujet de comment cela fonctionne.

Depuis que le code est dans le service, pourquoi ne pas automatiquement savoir qu'un cercle est dérivé de forme? En outre, qu'est-ce que ServiceKnownType fait faire?

Quand ServiceKnownType est mis au-dessous du DataContract, apparemment qui le fait fonctionner. Je devine qu'il dit bon, ce type d'objet particulier appelé forme peut aussi être un cercle. J'ai du mal à comprendre pourquoi il le ferait de cette façon autour, parce que si vous ajoutez un nouveau type comme la place que vous allez devoir ajouter à la classe Shape un ServiceKnownType pour elle. Ne serait-il pas logique si elle ne peut pas la déduire, de mettre le KnownType sur la place plutôt que la forme? Ainsi, la place dit hey, je suis une forme, et vous ne devez pas jouer avec la classe de forme? Si votre classe Shape est construit dans une bibliothèque et que vous voulez créer votre propre forme dervied comme DiamondShape, vous ne pouvez pas ajouter à la classe Shape parce que vous n'avez pas accès au code source.

Était-ce utile?

La solution

Le problème est que WCF ne va pas dans toutes les assemblées et essaye de trouver tous peut-être sous-types de forme. Il transmet également ne pas les informations de type (assemblage, le nom complet du type) avec le document XML.

Ainsi, alors qu'il ne serait pas un problème pour générer une balise « Circle » sur le XML sortant, le deserializater entrant ne sait pas quoi faire avec cela.

Le KnownType « hack » est comme un registre des types connus qui doit être mis en œuvre par les deux parties. Il est explicite. Avec ce registre, le désérialiseur sait que « Circle » désérialise taper X, sans aucune chance de ambiquity et sans avoir à analyser tous les ensembles disponibles ou accessibles pour les types dérivés.

Rappelez-vous, la place ne dit pas: « Je suis une forme », il se présente comme une balise XML et de ce que vous ne savez pas facilement et automatiquement quelle classe .NET à utiliser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top