如何对付两种不同版本的Web服务?

时间:2015-03-21 11:19:18

标签: c# .net web-services c#-5.0

我的项目是第三方Web服务(旧式Web服务与WCF服务)的消费者,它有两个版本,"沙盒" (分期)和prod服务。这些服务上的API几乎完全相同,我正在寻找一种在两个版本之间进行干净切换的方法,最好不要使用条件编译。

我本能地匆匆离开并从Visual Studio"添加网络参考"生成的客户端中提取了一个界面,即AgentImport,但该类不是部分的,所以我可以&# 39;使它从界面或任何其他超类派生。我已经为AgentImport的所有客户端创建了AgentImport实例,并且很好地封装在一个抽象基础中,但是如果不使用更高风险的编译器指令,我如何在{{1}的v1和v2之间切换}?

一些代码:

AgentImport

我已经尝试添加服务引用而不是Web引用,如下面的评论中所建议的那样,至少可以访问部分类,但是当我为生产服务添加第一个服务引用时,并从auto中提取接口生成的SOAP客户端,即using Clients.PrivateProperty.AgencyServicesApiService; namespace Client.PrivateProperty { public abstract class PrivPropFacilityBase { protected static AgentImport Client; protected PrivPropFacilityBase() { Client = new AgentImport(); Client.Timeout = 10000; } protected virtual AgentImport GetClient() { return new AgentImport(); } } } ,该接口引用在其他自动生成的类中声明的对象,与客户端在同一名称空间中,例如IAsapiClient

SecurityToken

如果我为登台服务添加第二个服务引用,则第二个自动生成的SOAP客户端引用其自己的命名空间中的对象,例如现在它使用void UpdateUniqueAgentID(string PrivatePropertyAgentId, string AgentId, AgencyServicesApiService.SecurityToken Token); ,所以我的编译器告诉我它没有实现我第一次提取的接口。然后我不得不为主接口AgencyServicesApiSandbox.SecurityToken引用的每个对象提取一个新接口,这使得这个主接口只使用提取的合同,而不是实际的类名。

追求上述<我得出的结论是,我唯一可行且风险最小的方法是使用两个客户端项目,一个专门用于生产服务,另一个用于登台服务。然后,在执行时,我只需要担心在两个众所周知的,即不是自动生成的客户端对象之间动态选择。

0 个答案:

没有答案