【问题标题】:WCF service with class inheritance具有类继承的 WCF 服务
【发布时间】:2012-01-10 21:42:20
【问题描述】:

我有一个使用类层次结构的 WCF 服务。基类 BaseService 只有基本信息(看图),而我继承的类有扩展信息。 Service 的属性之一是枚举。 BaseService 设置了 DataContract 属性,其中 KnownType 属性指向 Service。

其中一个服务返回一个 BaseService 列表,但是当我调用它时,我从 WCF 收到一个错误。我启用了日志,可以看到错误与未设置服务中的枚举有关。该服务不返回服务列表,而是返回 BaseService 列表,因此枚举不应该与上下文相关。似乎 WCF 正在尝试返回服务列表,即使该方法返回 BaseService 列表。

错误信息是: 尝试序列化参数http://tempuri.org/:GetShallowServiceResult 时出错。 InnerException 消息为“Enum value '0' 对于“MyService.ServiceTypeEnum”类型无效,无法序列化。

我不知道为什么会这样?

更新: 事实证明,我错过了将构造函数更改为使用 BaseService 类而不是继承的 Service 类。这说明 WebService 正在尝试序列化一些未设置的枚举。现在就像一个魅力。

【问题讨论】:

    标签: wcf inheritance enums


    【解决方案1】:

    你是如何声明你的枚举的?你用过下面的模式吗?

    public enum MyEnumeration
    {
       [EnumMember]
       Value0 = 0,
    
       [EnumMember]
       Value1 = 1,
    
       [EnumMember]
       Value2 = 2
    }
    

    枚举不需要 [DataContract] 属性,顺便说一句。

    【讨论】:

    • 是的 - 我的枚举是这样定义的。由于错误消息,我尝试为 0 添加一个值,但我仍然收到相同的错误消息。在我看来,问题出在类继承上。
    【解决方案2】:

    您需要添加将在 ServiceKnownType 声明中序列化的所有包含的枚举。

    [ServiceContract]
    [ServiceKnownType(typeof(MyEnum))]
    public interface IMyService
    {
        [OperationContract]
        ServiceMethod(MyEnum enom);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      相关资源
      最近更新 更多