J'ai essayé d'utiliser un client SilverLight pour appeler un service ASP.Net WCF qui renverrait un message de type Dictionary<string, object>
. Cela fonctionnait bien lorsque les valeurs du dictionnaire étaient des types simples comme int
, string
o Guid
.
Cependant, j'ai maintenant un scénario où j'ai besoin que l'une des valeurs soit un tableau de Dictionary<string, object>
! Tout se compile bien et la signature du service n'a pas changé mais l'appel de service échoue maintenant.
Une idée pour réparer ça ? J'ai essayé d'annoter la classe et les méthodes de mon service avec la balise KnownType
y ServiceKnownType
mais cela n'a pas fonctionné.
Voici un morceau de code :
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
[OperationContract]
[ServiceKnownType(typeof(Dictionary<string, object>))]
public Dictionary<string, object> GetObject()
{
return new Dictionary<string, object>()
{
{ "pty1", 1 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
{ "pty4", new Dictionary<string, object>[]
{
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blah" },
}
,
new Dictionary<string, object>()
{
{ "pty1", 4 },
{ "pty2", Guid.NewGuid() },
{ "pty3", "blahblah" },
}
}
}
};
}
}
Merci pour vos réponses. J'ai activé le traçage WCF et, comme prévu, il y a un problème pendant la sérialisation. Le problème n'est pas la sérialisation de Dictionary<string, object>
mais celle de Array
de Dictionary<string, object>
.
Ici l'exception enregistrée par le service de WCF.
Une erreur s'est produite lors de la tentative de sérialisation du paramètre :GetObjectResult. Le message InnerException était 'Type 'System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System. Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]][]' avec le nom de contrat de données 'ArrayOfArrayOfKeyValueOfstringanyType : http://schemas.microsoft.com/2003/10/Serialization/Arrays n'est pas attendu. Ajoutez tous les types non connus statiquement à la liste des types connus - par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus transmis à DataContractSerializer.'. Veuillez consulter InnerException pour plus de détails.
J'ai également essayé de définir une nouvelle DataContract
avec un seul membre de données mais cela a conduit à la même erreur.
Voici le code pour cela, suivi de l'exception enregistrée par le logging WCF.
[DataContract]
[KnownType(typeof(ObjectHolder))]
public class ObjectHolder
{
[DataMember]
public object Object { get; private set; }
public ObjectHolder(object obj)
{
this.Object = obj;
}
}
Une erreur s'est produite lors de la tentative de sérialisation du paramètre :GetObjectResult. Le message InnerException était 'Type 'System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[SilverlightApplication7. Web.ObjectHolder, SilverlightApplication7.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]][]' avec le nom de contrat de données 'ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb : http://schemas.microsoft.com/2003/10/Serialization/Arrays n'est pas attendu. Ajoutez tous les types non connus statiquement à la liste des types connus - par exemple, en utilisant l'attribut KnownTypeAttribute ou en les ajoutant à la liste des types connus passés à DataContractSerializer.'. Veuillez consulter InnerException pour plus de détails.
Encore une fois, j'ai joué avec ServiceKnownType
para ObjectHolder
, ObjectHolder[]
et même ObjectHolder[][]
puisque l'exception mentionne un " ArrayOfArrayOfKeyValueOfstringObjectHolder
".
Toujours pas de solution.