我有一个ServiceContract
,它返回动态类型,如下所示:
public dynamic LoginViaOpenId(string openIdUrl)
动态返回类型可以是我定义的DataContract
,也可以是字符串。但由于我没有在服务上使用DataContract
,客户端对此一无所知,也无法访问它。
我的DataContract
如下所示:
[DataContract]
public enum OpenIdStatus
{
[EnumMember]
Authenticated,
[EnumMember]
Authenticating,
[EnumMember]
Cancelled,
[EnumMember]
Failed,
[EnumMember]
RedirectToLogon
}
我知道如果我有层次结构类型我可以用KnownType
来征服这个,但是对于这个场景我没有想法。
有什么想法吗?
答案 0 :(得分:16)
动态DataContract是矛盾的。 DataContract是一个预先确定且相互认可的数据结构,dynamic
是一个结构未预先确定的对象,因此无法达成一致,因为它可以是任何东西。
看起来您实际上不需要返回动态数据类型,而是返回不同的数据类型。不同之处在于变化数据类型是一组固定数据类型之一,而动态数据类型是不具有预定结构的数据类型。由于您的返回值是几种已知形状之一,因此无需使用WCF不支持的“无形”(或“自由形式”)动态类型。
相反,您可以让[OperationContract]
方法返回一个带有[DataContract]
的类型,该类型将充当具有object
类型的单个数据成员的包装器对象,并使用{{ 1}}在包装器对象上指定可能在包装器内返回的可能类型。由于所有内容都来自[KnownType]
,因此已经存在层次结构。
object
答案 1 :(得分:3)
我认为WCF会在序列化/反序列化动态类型时出现问题。我建议您根据定义的接口为方法返回设置合同。或者,您可以自己负责序列化,并使您的服务返回一个字符串。客户端必须知道要将字符串反序列化的类型。这里有一个类似的问题: -