本地控制台调用ASMX服务:如何复用本地模型避免重写代码?
解决ASMX Web Service对象与本地模型命名空间冲突的问题
方法1:共享模型DLL(推荐)
- 直接在客户端项目中引用同一个模型DLL,而非通过WSDL自动生成全新的代理类。
- 添加Web引用时,进入高级设置,勾选「重用指定程序集中的类型」,选择你的模型DLL。这样生成的客户端代码会直接复用本地模型的类型,彻底规避命名空间差异问题。
- 操作流程:添加Web引用后点击「高级」按钮,在「重用类型」区域选中目标模型DLL,确认后生成的代理类将直接使用本地已有的模型类。
方法2:手动统一命名空间
- 若无法共享DLL,可修改自动生成的代理类,将WSDL生成对象的命名空间替换为本地模型的命名空间。
- 打开生成的
Reference.cs文件,找到所有自动生成类的命名空间声明,替换为本地模型的命名空间,同时同步修改所有相关属性、方法签名中的类型引用。 - 注意:每次更新Web引用时该修改会被覆盖,仅适合临时场景。
方法3:用对象映射工具简化转换
- 使用AutoMapper这类工具批量处理属性映射,避免手动编写大量转换代码。
- 示例代码:
// 初始化映射配置 var config = new MapperConfiguration(cfg => { cfg.CreateMap<RemoteNamespace.ModelClass, LocalNamespace.ModelClass>(); // 按需添加其他需要映射的类型 }); IMapper mapper = config.CreateMapper(); // 执行对象转换 var remoteObj = webService.GetModel(); var localObj = mapper.Map<LocalNamespace.ModelClass>(remoteObj); - 这种方式无需修改命名空间,通过工具自动完成属性匹配,适合无法共享DLL且服务更新频繁的场景。
方法4:修改ASMX服务的命名空间
- 在ASMX服务代码中,将服务与模型的命名空间设置为和本地客户端一致。
- 修改服务类的
[WebService]属性:[WebService(Namespace = "http://your-local-namespace/")] public class YourService : WebService { // 服务方法实现 } - 确保模型类的命名空间与客户端一致,重新发布服务后,客户端更新WSDL时会生成与本地命名空间匹配的对象。
内容的提问来源于stack exchange,提问作者Chen
相关产品推荐
相关产品推荐

