2010-06-09 7 views
1

j'ai un service qui implémente le DataMember suivant:problèmes avec WCF KnownType pour Dictionnaire

[DataMember] 
public Dictionary<string, List<IOptionQueryResult>> QueryResultItems { get; set; } 

J'ai la classe « OptionQuerySingleResult » qui hérite de IOptionQueryResult. Maintenant, je comprends que je dois faire le type de OptionQueryResult « connu » au service et donc essayé d'ajouter le KnownType de diverses manières:

[KnownType(typeof(Dictionary<string, OptionQuerySingleResult[]>))] 
[KnownType(typeof(Dictionary<string, List<OptionQuerySingleResult>>))] 
[KnownType(typeof(OptionQuerySingleResult)] 

Cependant, aucune de ces approches a travaillé et sur le côté client I » soit l'échec de la désérialisation, soit l'arrêt prématuré de la requête par le serveur, provoquant une erreur de connexion interrompue.

Quelqu'un a-t-il une idée de la meilleure façon de faire fonctionner ce système? Je voudrais ajouter que si je change la définition de QueryResultItems pour utiliser le type concret, au lieu de l'interface, tout fonctionne très bien.

Merci,

Tom

Edit: L'exception que je reçois est:

Erreur dans la ligne 1 Position 524. Element 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType' contient des données d'un type qui correspond à la name ': OptionQuerySingleResult'. Le désérialiseur n'a aucune connaissance de tout type qui correspond à ce nom. Envisagez d'utiliser DataContractResolver ou ajoutez le type correspondant à 'OptionQuerySingleResult' à la liste des types connus, par exemple, en utilisant l'attribut KnownTypeAttribute ou en l'ajoutant à la liste des types connus transmis à DataContractSerializer.

Cependant, quand je regarde le proxy client qui svcutil génère, "OptionQuerySingleResult" est certainement défini dans ce:

[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="OptionQuerySingleResult", Namespace="")] 
[System.SerializableAttribute()] 
public partial class OptionQuerySingleResult : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged 

Répondre

1

Je pense que vous utilisez:

[KnownType(typeof(OptionQuerySingleResult)] 

Mais il faut aussi un [DataContract(Name = "OptionQuerySingleResult")] sur votre classe OptionQuerySingleResult.

Je pense que cela dépend également de vos classes de proxy client générées par l'utilitaire SVCUTIL.EXE.

+0

Malheureusement, cela ne semble pas fonctionner non plus.Ce qui est étrange cependant, si j'ajoute [KnownType (typeof (OptionQuerySingleResult)] et retourne une liste de IOptionQueryResult, au lieu du dictionnaire, cela fonctionne très bien. – TJF

0

Vous devez simplement ajouter la propriété suivante à votre classe datacontract. Donc, maintenant le proxy généré contient les Knowtypes que vous avez définis sur le contrat de données. J'ai eu le même problème et c'est la seule solution que j'ai trouvée. Si vous ne le faites pas à la propriété de type Object pour vous DataContract classe, le proxy généré ne contient pas les knowtypes déclarés

Par exemple:

[DataContract] 
[KnownType(typeof(List<String>))] 
public class Foo 
{ 
    [DataMember] 
    public String FooName { get; set; } 

    [DataMember] 
    public IDictionary<String, Object> Inputs { get; set; } 

    [DataMember] 
    private Object UsedForKnownTypeSerializationObject{ get; set; } 

} 

C'est pas aussi joli parce que vous finissez avec une propriété fictive qui n'a aucune implémentation fonctionnelle . Mais là encore, je n'ai pas d'autre solution.

Questions connexes