DataContract 中的 WCF 对象

WCF object within DataContract

[编辑]:我添加了 TokenType 枚举,是什么导致了整个问题...

我在使用 WCF 时遇到问题,遗憾的是我没有找到任何有用的帮助。 我正在创建一个基于 WCF 的应用程序。当服务器响应客户端的请求时,我希望发回以下 class:

[DataContract]
public enum TokenType
{
    User,
    Device
}

[DataContract]
public class AuthenticationResponse
{
    [DataMember]
    public LogonStatus Status { get; set; }

    [DataMember]
    public AccessToken Token { get; set; }
}

[DataContract]
public struct AccessToken
{
    [DataMember]
    public string TokenID
    {
        get;
        set;
    }

    [DataMember]
    public TokenType Type
    {
        get;
        set;
    }

    [DataMember]
    public string Uid
    {
        get;
        set;
    }

    [DataMember]
    public string Name
    {
        get;
        set;
    }

    [DataMember]
    public DateTime ExpirationTime
    {
        get;
        set;
    }

    [DataMember]
    public DateTime GenerationTime
    {
        get;
        set;
    }

    [DataMember]
    public bool IsExpired
    {
        get
        {
            return DateTime.Now > this.ExpirationTime;
        }
    }
}

当我将 AuthenticationResponse 发送回客户端时,它总是失败。 我的问题:是否有机会在 DataContract 对象中使用 class/struct 对象,或者我是否必须在 AuthenticationResponse 对象中用基本类型(例如字符串)替换 AccessToken 对象?

感谢大家的帮助! 最好的问候

嘉宝

问题是您的 public bool IsExpired 没有 setter,因此在序列化对象时会出现问题。

解决方法是将 protected/private setter 设置为您的 属性 空主体(或用方法替换它)

[DataMember]
public bool IsExpired
{
    get
    {
        return DateTime.Now > this.ExpirationTime;
    }
    set
    {
        /* Dummy setter for serialization fix */
    }
}

您可以在此处找到有关序列化的更多信息:https://msdn.microsoft.com/en-us/library/182eeyhh.aspx

更具体地说:

Items That Can Be Serialized

The following items can be serialized using the XmLSerializer class:

Public read/write properties and fields of public classes

啊…… 对不起。我真的很愚蠢...我忘记在我原来的问题中粘贴 TokenType 枚举什么是 AuthenticationResponse class 的一部分,这就是问题所在...我忘记设置 [EnumMember] 属性...

添加后一切正常

对于这个愚蠢且真正初学者的问题感到抱歉...

感谢大家的帮助!!!