WCF多终结点和IServices

5

我正在尝试使用WCF,并想知道有关终结点方面的相关信息。

我一直在阅读msdn上的视频,现在我想了解如何配置WCF服务。我的情况是如果我有多个IServices,比如我有一个IThis和一个IThat,并且客户端需要访问这两个服务(注意:他们将使用net.tcp),

  • IThis处理数据库查询,

  • IThat处理与数据库无关的计算,

我假设我必须为IThis和IThat定义单独的终结点,客户端需要分别引用它们。或者我创建一个包含IThis和IThat功能的总服务IThisAndThat在客户端中被引用?

还有其他处理具有多个IServices的WCF服务的方法吗?同时,可以为tcp定义基础地址,还是只能用于http?

~谢谢大家,任何帮助或指针都将不胜感激。

2个回答

4
我认为我需要为IThis和IThat定义不同的终结点,这些在客户端中是分开引用的。或者我创建一个包含这两个功能的整体IThisAndThat服务,在客户端中被引用?你可以两种方法都做: - 创建单独的服务实现类,一个是IThis,另一个是IThat - 或者创建一个单一的服务实现类,它同时实现IThis和IThat。 选择完全取决于您。 对于每个服务实现类,您可以定义任意数量的终结点。因此,如果您有一个实现IThis的ThisService,则可以为其定义HTTP和TCP终结点,并且您还有一个实现IThat的ThatService,为其定义TCP终结点。这完全由您决定。 但是,如果您有一个实现两个服务契约的ThisAndThatService,则无法为IThis定义3个终结点并为IThat定义两个不同的终结点-您定义的终结点是每个服务实现类的。 当然可以-您可以为各种寻址方案(http、net.tcp、net.msmq、net.pipe等)定义基地址。

@marc_s 确实一个终端点应该是针对接口而非实现类,毕竟终端点依赖于契约而不是实现。对于每个实现定义一个“服务”,但是该服务可以拥有多个终端点,每个终端点都有自己的(或共享的)契约……? - Kirk Broadhurst
@Kirk Broadhurst:是的 - 端点依赖于接口 - 但是它定义在<service>标签内,该标签为服务实现类定义一次。 - marc_s
@marc_s 那我不明白 "...你不能为IThis定义3个端点,而为IThat定义两个不同的端点..."。当然,您只需在一个服务上拥有5个端点,其中3个实现IThis,2个实现IThat。 - Kirk Broadhurst
@Kirk Broadhurst:由单个服务实现类实现的所有服务契约的端点共享许多内容:服务行为配置、服务基址等,因为这些是在每个服务实现类级别上定义的。 - marc_s
@marc_s 我理解你的意思,但是你写道:“如果你有一个实现了两个服务契约的ThisAndThatService,你不能为IThis定义3个端点和两个不同的IThat端点”,我认为这是误导性的。你可以为IThis定义3个端点和2个不同的IThat端点 - 只需要它们在同一个服务上即可。 - Kirk Broadhurst
@Kirk Broadhurst:是的,你可以为IThis定义三个端点,为IThat定义两个端点——但不能使用不同的基地址... - marc_s

1
一些基本概念:
每个服务都有一个或多个终结点。 这些终结点专属于各自的相关服务,即每个终结点只能属于一个服务,不能在多个服务之间共享。
一个终结点定义了对服务的入口点 - 它包括客户端可以利用的地址、绑定和契约。
不同的终结点必须有不同的地址,并且可以具有不同的绑定和契约(即不是必需的)。通常来说,不同的终结点会有不同的绑定 - 即传输协议。如果特定的客户端只能访问某些操作,则它们可以具有不同的契约。
最后,您的服务必须实现其各个终结点所公开的所有契约。
这里有一个非常简洁明了的 MSDN 页面,描述了这些概念。http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/9f4391e9-8b9f-4181-a081-860d42b992a9/

网络上关于 WCF 的信息非常丰富,需要学习的内容也很多。最好查看一些针对你想要做的事情的教程或指南。


这个踩有什么评论吗?它是否存在误导或错误的情况? - Kirk Broadhurst

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