VS添加连接服务设置CollectionMappings为Generic.List不生效问题
问题原因
这是Microsoft.Tools.ServiceModel.Svcutil 2.0.3-preview3.21351.2预览版本的已知Bug,CollectionMappings配置项未被正确传递到代码生成逻辑,所以即使在UI界面选择了Generic.List,生成的代理类依旧会返回数组类型,和序列化器选择无关,你观察到的[System.Runtime.Serialization.DataContractAttribute]标识也能佐证这一点。
解决方案
临时应急方案
你当前使用的查找替换Reference.cs的方法可用于短期紧急修复:
- 查找:
System.Threading.Tasks.Task<T[]> - 替换为:
Task<System.Collections.Generic.List<T>>
注意:该方案修改的内容会在下次重新生成服务引用时被覆盖,不建议长期使用
方案1:回退到Svcutil稳定版
直接回退到可正常识别集合配置的2.0.2版本即可:
- 打开Visual Studio Installer,点击「修改」,进入「单个组件」标签页
- 搜索「WCF Web Service Reference Provider」,卸载预览版本后安装2.0.2正式版
- 重新打开项目,进入「管理连接的服务」界面删除现有WCF服务引用,重新添加并选择Generic.List作为集合映射类型,生成的代码就会正常返回List
方案2:手动修改配置文件
不需要替换生成的代码,修改配置后重新生成即可生效:
- 打开WCF服务引用对应的
ConnectedService.json文件 - 在
ExtendedData节点下添加/修改配置项:
"CollectionMappings": [ { "TargetCollectionType": "System.Collections.Generic.List`1", "Namespace": "System.Collections.Generic" } ]
- 保存后右键点击对应连接服务,选择「重新生成」即可
方案3:使用dotnet-svcutil命令行工具生成代码
如果UI工具的配置始终不生效,可直接用命令行指定参数生成:
- 全局安装2.0.2稳定版命令行工具:
dotnet tool install --global dotnet-svcutil --version 2.0.2 - 执行生成命令,指定集合类型参数:
dotnet-svcutil http://你的WCF服务地址?wsdl --collection-type System.Collections.Generic.List`1
- 将生成的代码文件引入项目即可
补充说明
该Bug已经在后续Svcutil正式版本中修复,如果你不愿意回退版本,也可以升级到2.0.3正式版或更高版本,UI配置的集合映射即可正常生效。
内容的提问来源于stack exchange,提问作者Ross Kelly
相关产品推荐
相关产品推荐

