【问题标题】:Autogenerated enum definition causing problems on client side自动生成的枚举定义导致客户端出现问题
【发布时间】:2011-08-17 06:50:20
【问题描述】:

我有这样的情况,我有

  • WCF 服务 (VS2008) 托管在某处
  • 主解决方案 (VS2005) 有一个类型为“类库”的消费者项目,服务引用到此 WCF 服务
  • 在数据合同中,我有一个数据成员如下...

    [DataContract]
    public class Cmd
    {
       [DataMember]
       public string CommandText;
       [DataMember]
       public CommandType CommandType;
    }
    

代理 service.cs 是在我的消费者项目的服务参考文件夹中生成的(可能是因为我使用的是 vs 2005),其中包含服务的所有声明,其中 enum CommandType 有了新的定义

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.30")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/System.Data")]
public enum CommandType
{
    Text,
    StoredProcedure,
    TableDirect,
}

而不是来自 System.Data 的原始枚举

public enum CommandType
{    
    Text = 1,    
    StoredProcedure = 4,    
    TableDirect = 512,
}

这会导致从客户端到服务器的 CommandType 值分配不正确,

  1. 我应该怎么做才能克服这个问题。
  2. 我们能否在 WCF 服务上覆盖此 CommandType 枚举,以在整个过程中获得相同的枚举定义。

抱歉这么长的问题陈述......

【问题讨论】:

    标签: wcf service-reference system.data


    【解决方案1】:

    尝试定义您自己的明确继承自 int 的枚举,然后在自定义枚举到达服务器时将自定义枚举转换为 System.Data 枚举:

    public enum MyEnum : int {    
        Text = 1,    
        StoredProcedure = 4,    
        TableDirect = 512,
    }
    

    服务器端:

    CommandType t = (CommandType)myEnumVariable;
    

    【讨论】:

    • 感谢 Nathan 的快速回复,但我已经尝试过了,它仍然在客户端显示相同的枚举定义(我的问题定义中的第二个代码块)。并且仍然有同样的问题。我在客户端分配 scObj.myCommandType = (Service1.myCommandType)cmd.CommandType;
    【解决方案2】:

    WCF 中的枚举只是字符串。您的 CommandType 值将作为“Text”、“StoredProcedure”等存在于 SOAP 有效负载中。只有在服务器端才能将它们转换为整数。如果您想在合同中使用 int 值,则必须将 Cmd.CommandType 定义为 int 并通过“KnownTypes”指令公开您的枚举。不过,这违背了它作为枚举的目的。或者,完全避免在客户端进行投射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2021-01-02
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多