2012-04-12 9 views
5

Tengo un ServiceContract que devuelve tipo dinámico y se parece a lo siguiente:DataContract y tipo de retorno dinámico WCF

public dynamic LoginViaOpenId(string openIdUrl) 

El tipo de retorno dinámica podría ser un DataContract que he definido, o una cadena. Pero dado que no he usado mi DataContract en el servicio, el cliente no sabe nada al respecto y no puede acceder a él.

Mi DataContract es algo parecido a continuación:

[DataContract] 
public enum OpenIdStatus 
{ 
     [EnumMember] 
     Authenticated, 
     [EnumMember] 
     Authenticating, 
     [EnumMember] 
     Cancelled, 
     [EnumMember] 
     Failed, 
     [EnumMember] 
     RedirectToLogon 
} 

sé si tuviera tipos jerárquicos Podría haber usado KnownType conquistar esto, pero estoy fuera de la idea de este escenario. ¿Alguna idea?

Respuesta

16

Un DataContract dinámica es una contradicción. Un DataContract es una estructura de datos predeterminada y mutuamente acordada, y dynamic es un objeto cuya estructura no está predeterminada y, por lo tanto, no puede ser acordada, ya que puede ser cualquier cosa.

Parece que no necesita devolver un tipo de datos dinámico, sino un tipo de datos variable. La diferencia es que un tipo de datos variable es uno de un conjunto de tipos de datos fijos, mientras que un tipo de datos dinámico es uno que no tiene una estructura predeterminada. Como su valor de retorno es una de varias formas conocidas, no es necesario utilizar el tipo dinámico "sin forma" (o "forma libre"), que no es compatible con WCF.

En su lugar, usted podría tener el método [OperationContract] devolver un tipo con un [DataContract] que actuará como un objeto de contenedor que tiene un solo miembro de datos de tipo object, y utilizar [KnownType] en el objeto contenedor para especificar los tipos posibles que pueden estar regresó dentro de la envoltura. Dado que todo hereda de object, ya existe una jerarquía en su lugar.

[DataContract] 
[KnownType(typeof(OpenIdStatus))] 
[KnownType(typeof(string))] 
public class ReturnValue 
{ 
    [DataMember] 
    public object Value { get; set; } 
} 
+0

gracias por la idea elegante :-) – CjCoax

3

Creo que WCF tendrá problemas para serializar/deserializar su tipo dinámico. Le recomendaría que configure un contrato para el retorno del método basado en una interfaz definida. Alternativamente, usted mismo puede asumir la responsabilidad de la serialización y hacer que su servicio devuelva una cadena. El cliente deberá tener conocimiento de qué tipo deserializar la cadena. Hay una pregunta similar sobre esto aquí: -

How to return dynamic List from WCF HTTP Service

Cuestiones relacionadas