【问题标题】:Request and Response objects and WCF versioning请求和响应对象以及 WCF 版本控制
【发布时间】:2011-01-24 22:10:07
【问题描述】:

我正在设计我的第一个“合适的”WCF 服务,并且正在努力弄清楚如何最好地处理服务的版本控制。

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

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

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

我一直在研究 http://msdn.microsoft.com/en-us/library/ms731060.aspx 和其中的链接文章,但我只是想澄清一下。

我是否认为放弃 Request/Response 对象对于 WCF 版本控制更理想?

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

【问题讨论】:

    标签: wcf versioning


    【解决方案1】:

    我不同意放弃 Request/Response 对象就是这样。

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

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

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

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

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

    【讨论】:

    • 我可以看到。就在响应对象上。如果唯一的原因是提供错误通知,并且我正在转向处理/通知错误的 Fault 方法,那么您认为我可以省去响应对象吗?
    • 是的,绝对 - 在这种情况下,返回 void 是有意义的。如果需要,您可以随时添加对象。
    【解决方案2】:
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多