19

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

稍后,我们正在编写 ProductB。在此过程中,我们为我们唯一的 Web 服务添加了一个新方法。ProductA 发布时,该新方法不在 WSDL 中。我们在开发中不对 ProductA 进行任何更改。

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

我们唯一的 Web 服务的 WSDL 在生产中发生了变化,但是 ProductA 使用的方法的签名没有改变。它们仍在 WSDL 中。

ProductA 是否会因为我们以这种方式升级我们唯一的 Web 服务而出现任何问题?

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

4

5 回答 5

17

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

于 2010-02-10T01:35:56.207 回答
15

只是为了在现有答案中添加更多细节,需要对客户端代理进行相应更改的 Web 服务的唯一更改是:

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

添加新方法或向类型添加新字段/属性几乎总是非破坏性更改(不过,与客户端进行测试并没有什么坏处)。

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

于 2010-02-10T01:48:56.827 回答
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 中的新方法中断。

于 2013-04-25T00:09:15.083 回答
1

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

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

一些组织相信在客户端代码更改时测试客户端代码。

于 2010-02-10T01:49:35.047 回答
1

我不想在一个老化的线程上插话,很多关键点已经提出,但我想添加一个关于迁移框架的注释。在从 .Net 2.0 迁移到 4.6 之后,我有时会出现异常行为。我会详细说明具体的错误,但它们是前一段时间的。

我还想补充一点,尽管有这些评论,但我遇到了许多来自客户端的问题,即使在此处描述的最小更改之后也没有升级 Web 引用。我可能会补充一点,这可能是新框架的结果。多年来,我在 MSDN 的许多地方都读到过,应该始终重新生成 WSDL。

我实际上一直在寻找一种自动执行此操作的技术。以防止在 Web 服务更新时客户端崩溃。我在那次搜索中绊倒了这个线程。

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

于 2017-05-03T14:24:41.037 回答