我有一个案例,我有一个Web服务客户端作为更大的产品的一部分。这里的角色有点颠倒:客户端是托管Web服务的客户端,我们的应用程序就是消费者。
客户端目前都在运行这些Web服务的一个版本(最初由我们构建)。通过这一新产品,我们提供的Web服务堆栈将通过新功能进行扩展;如果客户希望获得对新功能的访问权限,则可以安装此新堆栈。
然而 - 关键要求是向后兼容性。 (可能很重要的是 - 我们在我们自己的服务器上运行了一个中央安装的网络软件;我们所有的客户都只通过网络从我们的服务器使用我们的系统。客户的系统,在另一方面,它们由它们单独托管 - 它们都有自己安装的产品(我们将Web服务作为附件安装到这些产品上)。因此 - 该项目的新版本应理想地检测给定客户端正在使用的Web服务堆栈的两个版本的WHICH(给定WSDL的URL和任何其他相关信息) - 并使用适当的Web服务客户端进行通信。理想情况下,URL应该相同(即“www.exampleCompany22.com/MyCompanyWebService/”可以运行版本1,“www.exampleCompany88.com/MyCompanyWebService/”可以运行版本2)。我们应该能够检测到他们正在使用哪个版本,并使用相应的代码。
我们可以控制我们的系统,以及版本2(未来的第二版Web服务),但不是现有的版本1(客户已安装的版本,如果他们选择,可以选择不升级)。
是否有任何内置功能(或任何库或任何其他简单方法)在.NET中实现此功能而无需任何解决方法?
我认为这不应该太难,但这可能不是 常见的情况......绝对不是我遇到的事情。
我可以想出几种解决手头问题的方法;但我想知道是否有一种实际的“正确”方式(或者如果之前有人有类似的案例,可以提供有关如何实施它的反馈)。
答案 0 :(得分:1)
您可以通过多种方式解决此问题,其中一些方法取决于您的网络服务的准确程度。
一种方法是客户端安装的一部分是调用服务器来通知他们使用的版本。在您调用客户端之前,您应检查内部表以识别版本号,然后采取适当的操作。
第二种方法是为您在客户端站点上安装的每个服务文件添加版本号。例如:OurService20.asmx
或OurService30.asmx
。除此之外,您还有一个名为GetVersion.asmx
的标准服务文件,它返回了您可以使用的最新版本。
另一种方法是完全转储WSDL和ASMX服务,并转移到RESTful架构,在该架构中保持完全相同的命名方案,即:OurService.ashx
。 注意扩展程序的区别。使用此方法,您可以执行诸如http://remoteclient/OurService.ashx?getVersion
之类的http GET并解析响应。从那时起,您就会确切地知道他们安装了什么版本。
就个人而言,我喜欢RESTful路线,因为它为您提供了更大的灵活性,并且可以让您的应用更容易被其他应用程序使用。