1

我有 2 个合同(cA 和 cB),由具有 2 个端点(epA 和 epB)的单个 WCF 服务实现。

不是出于安全目的,而纯粹是出于清晰/组织的原因,当我通过端点 A 发现服务时,我只想“查看”ContractA 的操作;同样,只能通过endpointB查看ContractB的操作。

我不需要“保护”这些操作本身。这种情况是这样的,任何给定的客户端只需要服务的一个“方面”,而不是两者(但是,操作本身共享资源,因此拥有一个服务而不是两个服务是有意义的)。

似乎任何给定的服务基本上都会获得 1 个 WSDL,因此所有操作都暴露给所有端点。这是它的工作方式,还是有办法通过屏蔽端点合同未定义的操作来“塑造”端点?

4

2 回答 2

1

默认情况下,您是对的 - 一个服务实现类获得一个 WSDL,其中包含该服务类实现的所有服务方法(来自所有服务合同)。

没有任何方法(据我所知)以任何(简单的)方式“塑造” WSDL - WCF 确实提供了进入创建 WSDL 的过程(静态或动态)的方法,但这些方法不适合胆小的人。将服务契约的实现拆分为两个单独的类会容易得多,然后您将拥有两个单独的服务、单独的 WSDL 等等。

于 2010-10-02T21:13:32.803 回答
1

马克是绝对正确的。我只是添加为什么会在 WCF 中发生这种情况。在 WCF 中,所有与元数据相关的功能都基于服务元数据行为和 mex 端点。这两个功能都是在服务级别上定义的。因此,您不能采用更高的粒度(除非您编写大量自定义代码)并为每个端点指定元数据。

WCF 服务(类)直接映射到 wsdl:service 元素,该元素将每个合同公开为单独的 wsdl:port(在 WCF 中称为端点)。这是回答你问题的重点。如果您不想在该 wsdl:service 中使用您的第二份合同,则您不能在同一个类中实现它。

您提到您的服务合同共享资源。在这种情况下,您的 WCF 服务可能还包含业务逻辑。这是你的问题的原因。实现 WCF 服务的良好设计是仅将它们创建为围绕单独的业务逻辑类的包装器。

于 2010-10-03T13:14:28.013 回答