【问题标题】:WCF object within DataContractDataContract 中的 WCF 对象
【发布时间】:2016-06-09 08:31:31
【问题描述】:

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

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

[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 对象中使用类/结构对象,或者我是否必须将 AccessToken 对象替换为 AuthenticationResponse 对象中的基本类型(例如字符串)?

感谢您的所有帮助! 最好的问候

加博

【问题讨论】:

  • 什么样的“失败”?
  • 服务器向客户端发送数据失败,直到 [DataMember] public AccessToken Token { get;放; } 在 AuthenticationResponse 类中不为空。如果它为 null 或使用字符串类型属性更改,则一切正常。

标签: c# wcf object datacontract datamember


【解决方案1】:

问题是您的public bool IsExpired 没有设置器,因此在序列化对象时会导致问题。

一种解决方法是为您的属性设置一个受保护的/私有的设置器,其主体为空(或用方法替换)

[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

更具体地说:

可以序列化的项目

可以使用 XmlSerializer 类对以下项目进行序列化:

Public read/write properties and fields of public classes

【讨论】:

  • 非常感谢!这是我的对象的一个​​问题。 :-)
  • 不要忘记将其标记为关闭问题的答案。
【解决方案2】:

啊…… 对此感到抱歉。我真的很愚蠢...我忘记将 TokenType 枚举粘贴到我原来的问题中什么是 AuthenticationResponse 类的一部分,这就是问题...我忘记设置 [EnumMember] 属性...

添加后,一切正常。

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

感谢大家的帮助!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多