Ho cercato di utilizzare un client SilverLight per chiamare un servizio WCF di ASP.Net che restituirebbe un valore Dictionary<string, object>
. Questo ha funzionato correttamente quando i valori nel dizionario erano semplici tipi come int
, string
o Guid
.Servizio WCF che restituisce un array di dizionario <stringa, oggetto>
Tuttavia, ora ho uno scenario in cui ho bisogno di uno dei valori per essere un array di Dictionary<string, object>
! Compilano tutti bene e la firma del servizio non è cambiata, ma la chiamata di servizio non riesce.
Qualche idea su come risolverlo? Ho provato ad annotare la mia classe di servizio e i metodi con gli attributi KnownType
e ServiceKnownType
ma non ha funzionato.
Ecco un pezzo di codice:
[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" },
}
}
}
};
}
}
Grazie per le vostre risposte. Ho attivato il tracciamento WCF e, come sospetto, c'è un problema durante la serializzazione. Il problema non è la serializzazione di Dictionary<string, object>
ma quella di di Dictionary<string, object>
.
Qui l'eccezione registrata dal servizio WCF.
Si è verificato un errore durante il tentativo di serializzare il parametro: GetObjectResult. Il messaggio InnerException era '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]] [] 'con nome contratto dati' ArrayOfArrayOfKeyValueOfstringanyType: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'non è previsto. Aggiungi qualsiasi tipo non noto staticamente all'elenco dei tipi noti, ad esempio utilizzando l'attributo KnownTypeAttribute o aggiungendoli all'elenco dei tipi noti passati a DataContractSerializer. '. Si prega di consultare InnerException per maggiori dettagli.
Ho anche provato a definire una nuova classe DataContract
con un singolo membro di dati, ma conduce allo stesso errore.
Ecco il codice per questo, seguito dall'eccezione registrata dalla registrazione WCF.
[DataContract]
[KnownType(typeof(ObjectHolder))]
public class ObjectHolder
{
[DataMember]
public object Object { get; private set; }
public ObjectHolder(object obj)
{
this.Object = obj;
}
}
Si è verificato un errore durante il tentativo di serializzare parametro: GetObjectResult. Il messaggio InnerException era 'Type' System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [SilverlightApplication7.Web.ObjectHolder, SilverlightApplication7.Web, Versione = 1.0.0.0, Culture = neutro, PublicKeyToken = null]] [] 'con nome contratto dati' ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'non è previsto. Aggiungi qualsiasi tipo non noto staticamente all'elenco dei tipi noti, ad esempio utilizzando l'attributo KnownTypeAttribute o aggiungendoli all'elenco dei tipi noti passati a DataContractSerializer. '. Si prega di consultare InnerException per maggiori dettagli.
Ancora una volta ho giocato con ServiceKnownType
per ObjectHolder
, ObjectHolder[]
e anche ObjectHolder[][]
poiché l'eccezione menziona un "ArrayOfArrayOfKeyValueOfstringObjectHolder
".
Ancora nessuna soluzione.
Che errore ricevi? –
La mia ipotesi sarebbe che la WCF potesse avere problemi nel serializzare l'oggetto. Potresti provare a creare i tuoi dizionari se ciò è fattibile. –
sipwiz
Sono d'accordo con sipwiz, avrete problemi a serializzare il dizionario. Dovresti fare in modo che il dizionario contenga un oggetto serializzabile (significa che devi cambiare il tuo dizionario per Dictionary –
srodriguez