为外部服务的操作合同控制 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=trueOperationContract 属性。

[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 代码生成的方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 WCF 中的任务构建异步操作合同的正确方法

WCF 数据合同

可移植/可互操作的 WCF 合同

WCF 服务合同不匹配

WCF - 使用完全相同的数据合同的多个服务合同

WCF合约不匹配问题