如何控制外部服务OperationContract的WCF代码生成规则?
.NET Framework项目SOAP服务引用自动生成IsOneWay=true的解决方案
问题根因
你遇到的是Visual Studio 2019 16.11.x版本内置svcutil工具的已知逻辑bug:当WSDL中操作的输出消息定义为空、或命名空间匹配存在异常时,工具会误将普通双向操作标记为单向操作,自动追加IsOneWay=true参数,该问题和WSDL本身是否变更无关,所以你回滚旧版WSDL仍然会复现。
生成规则控制方法
可以通过配置文件或svcutil参数直接控制OperationContractAttribute的生成逻辑,无需修改WSDL:
- 方法1:修改服务引用配置,永久生效
找到项目中对应服务引用的Reference.svcmap文件,在<ClientOptions>节点下新增子节点:
保存后重新更新服务引用,工具就会关闭自动判断单向操作的逻辑,不会再自动追加<GenerateOneWayOperations>false</GenerateOneWayOperations>IsOneWay=true参数。 - 方法2:用svcutil命令行手动生成代理代码
直接调用svcutil工具指定关闭单向操作生成开关,命令示例:
其中svcutil.exe http://你的服务地址?wsdl /oneWay:false /out:ServiceProxy.cs /config:ServiceProxy.config/oneWay:false参数就是强制禁用单向操作自动识别逻辑,生成的代码不会自带IsOneWay=true,将生成的代码和配置合并到项目中即可。 - 额外适配建议:如果对接的是SAP类SOAP服务,可在上述方法中追加
/serializer:XmlSerializer参数,避免DataContract序列化逻辑遗漏WSDL中新增的自定义字段。
内容的提问来源于stack exchange,提问作者Roman Yagodin
相关产品推荐
相关产品推荐

