Web services 向web服务添加方法:旧客户端是否需要更新web引用?

Web services 向web服务添加方法:旧客户端是否需要更新web引用?,web-services,soap,wsdl,signatures,Web Services,Soap,Wsdl,Signatures,ProductA使用我们唯一的web服务,它是与ProductA分开的部署。我们将两者都部署到生产环境中 稍后,我们将编写ProductB。在这一过程中,我们向唯一的web服务添加了一个新方法。ProductA发布时,该新方法不在WSDL中。我们在开发过程中不对产品A进行任何更改 当我们将ProductB部署到生产环境中时,我们还将部署(到生产环境中)我们唯一的web服务的新版本(到ProductA希望找到它的同一个端点URL)。我们不会将ProductA重新部署到生产环境中 我们唯一的web服

ProductA使用我们唯一的web服务,它是与ProductA分开的部署。我们将两者都部署到生产环境中

稍后,我们将编写ProductB。在这一过程中,我们向唯一的web服务添加了一个新方法。ProductA发布时,该新方法不在WSDL中。我们在开发过程中不对产品A进行任何更改

当我们将ProductB部署到生产环境中时,我们还将部署(到生产环境中)我们唯一的web服务的新版本(到ProductA希望找到它的同一个端点URL)。我们不会将ProductA重新部署到生产环境中

我们唯一的web服务的WSDL在生产中已经更改,但是ProductA使用的方法的签名没有更改。它们仍然在WSDL中

由于我们以这种方式升级我们唯一的web服务,ProductA会有任何问题吗


如果Web服务的更改方式使原始客户端的方法保持不变,您是否必须升级Web服务的客户端?

否。只要您保留产品a单独使用的方法,您就不必更新产品a的WebReference副本。

只需对现有答案添加一点详细信息,需要对客户端代理进行相应更改的web服务更改只有:

  • 去除方法
  • 更改方法签名
  • 更改绑定/行为(即使用加密)
添加一个新方法,或者向一个类型添加新字段/属性,几乎都是非破坏性的更改(不过,使用客户端进行测试并没有什么坏处)


当然,请记住,在重新生成这些新方法或属性之前,客户端实际上无法使用它们。但是它不会破坏现有的功能。

虽然我同意不更新现有客户端的服务引用可能不会有任何问题,但您也应该询问如果您更新现有客户端的服务引用会有什么问题。一定要测试这个场景

尽管我们倾向于将方法添加到服务中,认为这是服务器上唯一重要的事情,但请记住,当更新服务引用时,这实际上是在更改客户端的代码


一些组织相信在客户机代码发生变化时测试客户机代码。

通常我会说不。但是,50多个客户机中有一个在使用JAX-WS时遇到问题。他们会得到如下错误:

javax.xml.ws.WebServiceException: 

The Endpoint validation failed to validate due to the following errors: 

:: Invalid Endpoint Interface :: :: The operation names in the WSDL portType
do not match the method names in the SEI or Web service implementation class. 
wsdl operations = [...] 
我认为这与此有关:

上面说:“最佳实践:确保在收到更新的WSDL文件时重新生成客户端工件。”


然而,服务器端WSDL在运行时在我们的客户机实例中被检查,所以一旦我们添加了一个新方法,它就会失败。我不知道问题的具体内容或范围,但您似乎可以编写一个SOAP客户机实现,该实现将与服务提供的WSDL中的新方法分离

我不想插嘴一个老化的线程,已经提出了许多关键点,但我想补充一点关于迁移框架的说明。从.NET2.0迁移到4.6之后,我有时会有不寻常的行为。我会详细说明具体的错误,但那是很久以前的事了

我还想补充一点,尽管有很多这样的评论,但我还是遇到了很多客户的问题,他们甚至在中描述的最小更改之后也没有升级web引用。我可以补充一点,这可能是新框架的结果。多年来,我在MSDN的许多地方都读到,WSDL应该始终重新生成

事实上,我一直在寻找一种自动完成这项工作的技术。以便在web服务更新时防止客户端崩溃。在那次搜寻中,我无意中发现了这条线索


不是一个真正的答案,但这里的评论太长。

人们测试机器生成的代码?我不否认,但我。。。惊讶。@Aaronaught:这是密码。它叫。它可能会影响客户端程序,否则就不会存在。如果它改变,它可能会变得更糟。如果生命危在旦夕,你会想测试它。@Aaronaught:我不会说“永远”。作为一种极端情况,可以考虑编写一个程序,如果添加了一个方法,程序就会中断。这样的程序可以使用反射来枚举服务引用的方法和属性。然后它会检测到变化,并决定失败。这是我能想到的最极端的例子,但它让我可以想象,在一些不太极端的情况下,某些东西可能会断裂。另外,这可能取决于客户端使用的编程语言。@John:很公平。我附上了一份免责声明。