1

设想:

我有几项服务希望被不同的客户发现。执行发现工作正常。但是现在由于不同的原因,我拥有这些服务的不同版本。

我的应用程序生命周期中可能有 3 到 4 个不同的层:生产、登台、测试和开发。

我需要支持我在过去 6 个月内部署的客户端,因此我可能需要同时运行 2-3 个版本的服务。不是合同的不同版本,而是实现的版本略有不同。

我可能还需要按服务提供的数据类别来区分服务。假设我有一个提供美国数据的服务实例和另一个提供加拿大数据的实例,以及可能提供澳大利亚数据的第三个实例。在某些情况下,服务可能有多个类别。

因此,从客户的角度来看,如果我仅根据合同要求提供服务,我可能会获得 9 到 15 个端点,而我真的只想与美国生产版本 1.1 的一项服务交谈。我知道服务存在范围,但我未能成功创建一系列范围,以允许我在我的环境中需要的那种灵活性。

在前面的示例中,我正在寻找一个非常具体的服务,但我可能还想查看特定合同的所有服务,无论它们是什么国家或版本,仅适用于生产。我可能还需要在组合中添加额外的“范围”。总的来说,我可能有 4 - 6 个标准被用作“范围”。

问题:

范围是构建这种复杂过滤的正确方法还是我需要做一些自定义的事情?

如果范围是正确的方法,你能指出我可以看的样本吗?

如果我需要定制,是否有一种标准方法来扩展“范围”行为,以便我可以欺骗它做我想做的事情?

源代码:

http://nardax.codeplex.com/

4

1 回答 1

4

是的,范围是要走的路。我想向您推荐Juval Lowy(Programming WCF 服务一书的作者)的一篇很棒的文章Discover a New WCF with Discovery 。这是使用范围的直接引用:

范围在自定义发现和向应用程序添加复杂行为方面非常有用,尤其是在编写框架或管理工具时。范围的经典用途是使客户端能够区分来自不同应用程序的多态服务。然而,这在某种程度上是罕见的。在区分同一应用程序中的端点类型时,我发现范围很方便。

例如,假设对于给定的合同,您有多个实现。您拥有生产中使用的操作模式和测试或诊断中使用的模拟模式。使用范围,客户端可以选择所需的正确实现类型,并且不同的客户端不会因使用彼此的服务而相互冲突。您还可以让同一个客户端根据调用的上下文选择不同的端点。您可以拥有用于分析、调试、诊断、测试、检测等的端点。

这非常适合您要解决的问题。

这篇文章还包含在配置和代码中声明范围的好示例。从服务消费者的角度来看,我看到了两个选项:如果您想在发现阶段过滤您的服务,您可以填充FindCriteria您传递给该方法的所有所需范围,或者您可以获取所有服务并手动检查它们的范围。DiscoveryClient.Find

Scope 本身是一个Uri对象,因此它可以使用“key=value”表示法将许多不同的信息放在那里。这应该负责“扩展”范围过滤,并且不会限制您的前向兼容性。

于 2011-05-30T12:28:39.470 回答