He estado tratando de usar un cliente SilverLight para llamar a un servicio ASP.NET WCF que devolvería un Dictionary<string, object>
. Eso funcionó bien cuando los valores en el diccionario eran tipos simples como int
, string
o Guid
.servicio WCF que devuelve una matriz del diccionario <cadena, objeto>
Sin embargo, ahora tengo un escenario donde necesito que uno de los valores sea una matriz de Dictionary<string, object>
! Todo compila bien y la firma del servicio no ha cambiado, pero la llamada de servicio ahora falla.
¿Alguna idea de cómo solucionarlo? Intenté anotar mi clase de servicio y mis métodos con los atributos KnownType
y ServiceKnownType
pero eso no funcionó.
Aquí es una pieza de código:
[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" },
}
}
}
};
}
}
Gracias por sus respuestas. He activado el seguimiento WCF y, como se sospecha, hay un problema durante la serialización. El problema no es la serialización de Dictionary<string, object>
sino la de Array
de Dictionary<string, object>
.
Aquí la excepción registrada por el servicio WCF.
Se produjo un error al intentar serializar el parámetro: GetObjectResult. El mensaje InnerException fue 'Tipo' 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 el nombre del contrato de datos' ArrayOfArrayOfKeyValueOfstringanyType: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'no se espera. Agregue cualquier tipo no conocido de forma estática a la lista de tipos conocidos, por ejemplo, utilizando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos pasados a DataContractSerializer. '. Por favor, consulte InnerException para más detalles.
También he trato de definir una nueva clase DataContract
con un solo miembro de datos pero llevo hasta el mismo error.
Aquí está el código para eso, seguido de la excepción registrada por el registro de WCF.
[DataContract]
[KnownType(typeof(ObjectHolder))]
public class ObjectHolder
{
[DataMember]
public object Object { get; private set; }
public ObjectHolder(object obj)
{
this.Object = obj;
}
}
Se ha producido un error al intentar serializar parámetro: GetObjectResult. El mensaje InnerException fue 'Tipo' System.Collections.Generic.Dictionary`2 [[System.String, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [SilverlightApplication7.Web.ObjectHolder, SilverlightApplication7.Web, Versión = 1.0.0.0, Cultura = neutral, PublicKeyToken = null]] [] 'con el nombre del contrato de datos' ArrayOfArrayOfKeyValueOfstringObjectHolderWAwxSTlb: http://schemas.microsoft.com/2003/10/Serialization/Arrays 'no se espera. Agregue cualquier tipo no conocido de forma estática a la lista de tipos conocidos, por ejemplo, utilizando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos pasados a DataContractSerializer. '. Por favor, consulte InnerException para más detalles.
Una vez más he jugado con ServiceKnownType
para ObjectHolder
, ObjectHolder[]
e incluso ObjectHolder[][]
desde la excepción menciona un "ArrayOfArrayOfKeyValueOfstringObjectHolder
".
Todavía no hay solución.
¿Qué error recibes? –
Supongo que WCF podría tener problemas para serializar objetos. Podrías tratar de hacer tus diccionarios si eso es factible. –
sipwiz
Estoy de acuerdo con sipwiz, usted tendrá problemas para serializar el dictionario. Debe hacer que el diccionario contenga un objeto que sea serializable (lo que significa que necesita cambiar su Dictionary por Dictionary –
srodriguez