Datacontract和动态返回类型WCF

CjC*_*oax 6 wcf datacontract

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

public dynamic LoginViaOpenId(string openIdUrl)
Run Code Online (Sandbox Code Playgroud)

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

我的DataContract情况如下:

[DataContract]
public enum OpenIdStatus
{
        [EnumMember]
        Authenticated,
        [EnumMember]
        Authenticating,
        [EnumMember]
        Cancelled,
        [EnumMember]
        Failed,
        [EnumMember]
        RedirectToLogon
 }
Run Code Online (Sandbox Code Playgroud)

我知道如果我有过可以用来KnownType征服它的分层类型,但我不相信这种情况.任何的想法?

All*_*nek 17

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

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

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

[DataContract]
[KnownType(typeof(OpenIdStatus))]
[KnownType(typeof(string))]
public class ReturnValue
{
    [DataMember]
    public object Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)