.NET Core 3.1导入WCF引用枚举值丢失问题解决方案咨询
我之前也碰到过一模一样的情况,.NET Framework里正常的枚举到了.NET Core就丢值,核心原因就是两者默认的序列化逻辑和代码生成规则有差异。给你几个实用的解决办法:
1. 手动修正生成的枚举代码
Svcutil在.NET Core环境下生成的枚举可能缺少必要的序列化属性,导致值无法正确映射。你可以打开生成的服务引用代码,给枚举加上[DataContract]特性,同时给每个枚举成员添加[EnumMember(Value = "对应WSDL中的值")]特性,比如:
[DataContract] public enum OrderStatus { [EnumMember(Value = "Pending")] Pending = 1, [EnumMember(Value = "Shipped")] Shipped = 2, [EnumMember(Value = "Cancelled")] Cancelled = 3 }
这样就能和.NET 4.7.2里System.Runtime.Serialization的序列化行为对齐了。
2. 指定Svcutil使用DataContractSerializer生成代码
默认情况下,.NET Core的Svcutil可能用了不同的序列化器,你可以强制它用DataContractSerializer来生成代码,和.NET Framework保持一致:
命令行方式
运行Svcutil工具时加上/serializer:DataContractSerializer参数:
svcutil.exe /serializer:DataContractSerializer http://your-service-endpoint?wsdl
Visual Studio图形界面方式
右键项目 → 添加 → 服务引用 → 点击「高级」按钮 → 在「数据类型」区域选择「使用DataContractSerializer」,然后重新生成服务引用。
3. 更新Svcutil工具版本
你目前用的是Microsoft.Tools.ServiceModel.Svcutil 2.0.2,这个版本比较旧了,新版本已经修复了不少枚举生成的bug。打开NuGet包管理器,搜索并更新这个包到最新稳定版,然后重新生成WCF引用,大概率能解决问题。
4. 检查WSDL中的枚举定义
如果WSDL里的枚举是基于字符串值定义的(比如<xs:enumeration value="Completed"/>),要确保生成的枚举成员的EnumMember特性值和WSDL里的完全一致,大小写、拼写都不能错,否则序列化时会匹配失败导致值丢失。
内容的提问来源于stack exchange,提问作者Lev Z

