Datacontract和动态返回类型WCF

时间:2012-04-12 08:30:09

标签: wcf datacontract

我有一个ServiceContract,它返回动态类型,如下所示:

public dynamic LoginViaOpenId(string openIdUrl)

动态返回类型可以是我定义的DataContract,也可以是字符串。但由于我没有在服务上使用DataContract,客户端对此一无所知,也无法访问它。

我的DataContract如下所示:

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

我知道如果我有层次结构类型我可以用KnownType来征服这个,但是对于这个场景我没有想法。 有什么想法吗?

2 个答案:

答案 0 :(得分:16)

动态DataContract是矛盾的。 DataContract是一个预先确定且相互认可的数据结构,dynamic是一个结构未预先确定的对象,因此无法达成一致,因为它可以是任何东西。

看起来您实际上不需要返回动态数据类型,而是返回不同的数据类型。不同之处在于变化数据类型是一组固定数据类型之一,而动态数据类型是不具有预定结构的数据类型。由于您的返回值是几种已知形状之一,因此无需使用WCF不支持的“无形”(或“自由形式”)动态类型。

相反,您可以让[OperationContract]方法返回一个带有[DataContract]的类型,该类型将充当具有object类型的单个数据成员的包装器对象,并使用{{ 1}}在包装器对象上指定可能在包装器内返回的可能类型。由于所有内容都来自[KnownType],因此已经存在层次结构。

object

答案 1 :(得分:3)

我认为WCF会在序列化/反序列化动态类型时出现问题。我建议您根据定义的接口为方法返回设置合同。或者,您可以自己负责序列化,并使您的服务返回一个字符串。客户端必须知道要将字符串反序列化的类型。这里有一个类似的问题: -

How to return dynamic List from WCF HTTP Service