使用BizTalk WCF服务发布向导发布架构时枚举限制不生效如何解决
问题原因
BizTalk WCF Service Publishing Wizard默认不会将XSD中定义的xs:enumeration字符串限制转换为WCF合约的枚举类型,仅会将其识别为普通基础字符串类型,因此客户端生成代理类时无法获取枚举约束,输入值不会被限制。
解决方法
方案1:修改WCF服务合约定义,显式声明枚举类型
- 发布WCF服务时选择WCF服务 - 自定义隔离宿主模式,不要使用默认的一键发布选项。发布完成后找到生成服务对应的代码文件(通常存放在服务站点的
App_Code目录下)。 - 手动新增枚举类型定义,匹配你XSD中的枚举值:
public enum EventTypes { Created, Changed, Deleted }
- 找到对应数据合约中原来为字符串类型的EventTypes相关字段,将其类型替换为上面定义的
EventTypes枚举,同时为枚举值添加[XmlEnum]特性保证序列化和XSD定义一致。 - 修改站点的
web.config配置,开启元数据导出能力:
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="BizTalkWCFBehavior"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <dataContractSerializer maxItemsInObjectGraph="65536"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>
- 重新启动站点后,客户端重新引用服务即可自动生成对应枚举,传入非法值会直接在编译阶段报错。
方案2:服务端新增校验逻辑(双重保障)
为避免调用方绕过客户端枚举限制直接传入非法值,服务端需要新增校验规则:
- 在BizTalk接收管道中添加XML schema校验组件,传入的报文会直接用你定义的带枚举限制的XSD进行校验,不符合要求的报文会直接被拦截返回错误。
- 也可以在WCF服务的操作实现中添加参数校验逻辑,判断对应字段的值是否在允许的枚举列表内,不符合要求则直接抛出
FaultException返回错误提示。
注意事项
- 自动生成的服务代码会在下次使用向导重新发布时被覆盖,建议将自定义的枚举和数据合约单独放在独立类库中引用,避免修改丢失。
- 不需要手动编写枚举类的话,可以用
xsd.exe工具直接从你的XSD文件生成对应C#类型,保证XSD定义和代码定义完全一致。
内容的提问来源于stack exchange,提问作者JERKER
相关产品推荐
相关产品推荐

