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] 属性...
添加后一切正常
对于这个愚蠢且真正初学者的问题感到抱歉...
感谢大家的帮助!!!
[编辑]:我添加了 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] 属性...
添加后一切正常
对于这个愚蠢且真正初学者的问题感到抱歉...
感谢大家的帮助!!!