为外部服务的操作合同控制 WCF 代码生成的方法
Posted
技术标签:
【中文标题】为外部服务的操作合同控制 WCF 代码生成的方法【英文标题】:Way to control WCF code generation for operation contracts for external service 【发布时间】:2022-01-11 15:48:06 【问题描述】:我从 .NET Framework 库项目中引用了外部 SOAP 服务。在 Visual Studio 2019 (16.11.5) 中更新服务引用后,它开始生成带有IsOneWay=true
的OperationContract
属性。
[System.ServiceModel.OperationContractAttribute
(IsOneWay=true, Action="http://sap.com/xi/WebService/soap1.1")]
我没有注意到相关的 WSDL 更改,只有几个新字段。回滚到旧的 WSDL - 还是一样。
有没有办法通过配置文件或svcutil
控制 OperationContractAttribute 的生成?
【问题讨论】:
这应该是使用默认选择的DataContractSerializer的结果。要手动配置,请在服务的客户端打开Reference.svcmap
文件并将<Serializer>Auto</Serializer>
更改为<Serializer>XmlSerializer</Serializer>
。这会导致 VS 停止生成消息合约。
在Reference.svcmap
中将序列化程序从Auto
更改为XmlSerializer
,但仍使用IsOneWay=true
生成OperationContract 属性。
为什么要控制它的生成?你可以看看这个Understanding Generated Client Code
我理解生成的代码,但也想了解它为什么会改变。
【参考方案1】:
应该根据服务改变: 使用单向设计模式:
当客户端必须调用操作并且不受 操作级别的操作结果。 使用 NetMsmqBinding 或 MsmqIntegrationBinding 类时。 (有关此方案的详细信息,请参阅 WCF 中的队列。)One-Way ServicesOperationContractAttribute Class
【讨论】:
我发现生成的代码以前是由另一个开发人员手动更改的。所以svcutil
默认使用IsOneWay=true
生成操作合约属性,这个行为并没有像我想象的那样改变。以上是关于为外部服务的操作合同控制 WCF 代码生成的方法的主要内容,如果未能解决你的问题,请参考以下文章