wcf - 请求和响应对象以及 WCF 版本控制

标签 wcf versioning

我正在设计我的第一个“合适的”WCF 服务,并且正在尝试了解如何最好地处理该服务的版本控制。

在较旧的 ASMX Web 服务中,我会为每个 Web 服务方法创建一个 MethodNameRequestMethodNameResponse 对象。

请求对象实际上只是方法参数中通常包含的内容的 POCO 包装器。响应对象通常可以继承自具有有关任何错误的信息的基本响应对象。

阅读有关 WCF 以及 IExtensibleDataObjectFaultContractAttribute 和 Namespacing 的工作原理后,似乎我可以恢复在我的方法中使用标准参数(字符串、int 等)名称,如果服务有版本控制,则 ServiceContract 继承可以提供此版本控制。

我一直在调查http://msdn.microsoft.com/en-us/library/ms731060.aspx并链接了其中的文章,但我只是在寻找一些澄清。

我认为放弃请求/响应对象对于 WCF 版本控制来说更理想,这种想法是否正确?

编辑:我刚刚发现这篇文章建议使用显式请求/响应对象:http://www.dasblonde.net/2006/01/05/VersioningWCFServiceContracts.aspx

最佳答案

我不同意放弃请求/响应对象是这样的做法。

使用消息进行编码有明显的好处:

  • 您可以重用它们,这可以避免将 5 个整数和 3 个字符串传递给许多不同的方法。
  • 属性已命名,因此可以可靠地理解,而通过多层按值传递的参数可能会令人困惑,等等。
  • 如果您选择的话,它们可以是适当的对象而不仅仅是数据容器 - 包含私有(private)方法等

但是您确实在询问版本控制。不要忘记您可以对服务契约(Contract)中的消息进行版本控制。程序集中的类可以具有相同的名称,前提是它们位于不同的命名空间中(例如 v1.Requestv2.Request),并且它们都可以实现所需的接口(interface)或继承来自一些基础对象。

它们还需要为您的服务使用者进行版本控制,这可以通过 xml 命名空间来完成;我通常将服务契约(操作)放在 http://myapp.mydomain/v1 等命名空间中,并将消息(请求和响应对象)放在 http://中myapp.mydomain/v1/messages.

这种方法的一个问题是,如果您有一个操作,请在 http://myapp.mydomain/v1 命名空间中将其称为 Submit,然后按照约定/默认情况下,soap 对象 SubmitRequestSubmitResponse 也将存在于同一 namespace 中(我不记得运行时异常是什么,但它让我困惑了一段时间)。解决方案是将消息对象放入另一个命名空间中,如上所述。

关于wcf - 请求和响应对象以及 WCF 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787796/

相关文章:

node.js - NPM 从 GitHub 拉取错误版本

iphone - 手动核心数据版本控制

wcf - 关闭WCF连接

oracle - BizTalk WCF-Custom”引发错误 ORA-29275 : partial multibyte character

c# - 如何在已安装的服务上授予对 HTTP 命名空间的权限?

ruby-on-rails - REST API 版本控制 - 为什么模型没有版本控制

Spring MVC 3.1 - REST Web 服务版本控制

c# - 在哪里使用 MVVM 中的 Web 服务?

visual-studio-2008 - 当 Visual Studio 已在运行时,如何在 Visual Studio 中启动第二个控制台应用程序

ruby-on-rails - 为下一个 API 版本使用不同的 gem 的版本控制