6

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

public dynamic LoginViaOpenId(string openIdUrl)

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

DataContract的如下所示:

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

我知道如果我有分层类型,我可以用来KnownType克服这个问题,但我不知道这种情况。任何想法?

4

2 回答 2

18

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

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

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

[DataContract]
[KnownType(typeof(OpenIdStatus))]
[KnownType(typeof(string))]
public class ReturnValue
{
    [DataMember]
    public object Value { get; set; }
}
于 2012-04-12T09:02:31.037 回答
3

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

如何从 WCF HTTP 服务返回动态列表

于 2012-04-12T08:43:16.893 回答