添加方法到Web服务:旧客户端需要更新Web引用吗?

19

ProductA使用我们唯一的Web服务,这是与ProductA分开部署的。我们都部署到生产环境中。

后来,我们在编写ProductB。在此过程中,我们向我们唯一的Web服务添加了一个新方法。当ProductA交付时,该新方法不在WSDL中。我们没有更改ProductA的开发。

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

我们唯一Web服务的WSDL在生产中已更改,但ProductA正在使用的方法签名未更改。它们仍然在WSDL中。

在这种方式下升级唯一Web服务,是否会对ProductA造成任何问题?

如果Web服务发生变化,并且原始客户端的方法保持不变,您是否必须升级Web服务的客户端?

5个回答

17

不需要。只要你不对Product A使用的方法进行更改,就无需更新Product A的WebReference副本。


15

仅仅是为了对现有答案添加更多详细信息,唯一需要相应更改客户端代理的Web服务更改包括:

  • 删除方法;
  • 更改方法签名;
  • 更改绑定/行为(即使用加密)。

添加新方法或向类型添加新字段/属性几乎总是非破坏性更改(但测试客户端也不会有损)。当然,请记住,直到重新构建后,客户端才能实际使用这些新方法或属性。 但它不会破坏现有功能。


@Aaronaught:我不会说“总是”。作为一个极端的例子,考虑编写一个程序,如果添加了一个方法就会崩溃。这样的程序可以使用反射来枚举服务引用的方法和属性。然后它将检测到更改,并决定失败。这是我能想到的最极端的例子,但它让我想象可能有一些不那么极端的情况,实际上可能会出现一些问题。此外,这可能取决于客户端使用的编程语言。 - John Saunders
@John:好的,我已经加上了免责声明。 - Aaronaught

2

通常我会回答不行。然而,我们有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 = [...] 

我认为这与以下内容有关: http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc%2Finfo%2Fae%2Fae%2Ftwbs_devjaxws_exposewebmethod.html 其中提到:“最佳实践:确保每次接收到更新的WSDL文件时重新生成客户端侧工件。”
然而,我们客户端实例中的服务器端WSDL在运行时进行检查,因此一旦添加新方法就会失败。 我不知道问题的具体细节或范围,但似乎您可以编写一个SOAP客户端实现,以便在服务提供的WSDL中添加新方法时会出现错误。

1

虽然我同意不更新现有客户端的服务引用可能不会有任何问题,但您还应该问一下如果您更新现有客户端的服务引用会有什么问题。请确保也测试这种情况。

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

一些组织认为,在客户端代码更改时测试客户端代码很重要。


人们测试机器生成的代码?我不否认,但我感到有些惊讶。 - Aaronaught
1
@Aaronaught:这是代码。它被调用。它可以影响客户端程序,否则它不会存在。如果它发生变化,可能会变得更糟。如果牵涉到生命安全,你需要测试它。 - John Saunders

1
我不想在一个老旧的讨论串中插话,许多关键点已经被提出,但我想补充一下关于迁移框架的注意事项。在从 .Net 2.0 迁移到最新版本 4.6 时,我有时会遇到异常行为。我想详细说明特定的错误,但它们是一段时间前发生的。
我还想补充一点,尽管大多数评论都是这样说的,但我曾遇到过很多客户的问题,即使在这里描述的最小更改后,他们仍未升级 Web 引用。(我也可以说这可能是新框架的结果)我在 MSDN 的许多地方读到过,应该始终重新生成 WSDL。
我实际上一直在寻找自动完成此操作的技术,以防止当 web 服务得到更新时客户端崩溃。我在搜索中偶然发现了这个讨论串。
这不是一个真正的答案,但在这里评论太长了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接