自动生成的枚举定义导致客户端出现问题

时间:2011-08-17 06:50:21

标签: wcf service-reference system.data

我有这种情况,我有

  • 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枚举,以获得相同的枚举定义。
  3. 很抱歉这么长的问题陈述......

2 个答案:

答案 0 :(得分:0)

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

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

服务器端:

CommandType t = (CommandType)myEnumVariable;

答案 1 :(得分:0)

WCF中的枚举只是字符串。您的CommandType值将作为“Text”,“StoredProcedure”等存在于SOAP有效内容中。仅在服务器端,您可以将它们作为int进行转换。如果要在合同中使用int值,则必须将Cmd.CommandType定义为int,并通过“KnownTypes”指令公开枚举。尽管如此,这种做法还是打败了它的目的。或者,只需完全避免在客户端进行投射。