0

这可能与重复,但那里收到的答案没有回答我的查询,而且我也无法在网上找到它。

以上面提到的问题中给出的示例为例,当我在客户端创建一个端点时,我编写了一个带有合约作为接口的端点。所以我在客户端的端点将类似于以下内容。

<client>
    <endpoint name="MyClientEndpoint" address="http://..." binding="basicHttpBinding"
     contract="IUselessService" />
</client>

同样在客户端的代码中,我创建了一个代理对象并调用该方法,即GetData.

所以我的问题是调用哪个类的方法?TestService还是RealService?因为在客户端我没有提到应该调用哪个类的方法。

我确信在 WCF 中的某个地方会有一些设置,以确保调用正确类的方法,但我找不到它。

另外我对 WCF 有点陌生,所以如果我在任何地方错了,请纠正我。

提前致谢。

问候,

萨马尔

4

2 回答 2

3

为了跟进我的评论,aServiceHost将主持合同的具体实施。它ServiceHost决定了服务契约的实现——客户端不知道实际的实现,只知道它通过代理连接到的服务中可用的方法。

因此,例如,如果客户端连接到http://somedomain.com/MyService.svc,并且暴露该端点的服务主机正在使用RealService,那么IUselessService客户端最终将使用 的实现。

在自托管服务中,服务可能如下所示:

ServiceHost myHost = new ServiceHost(typeof(RealService), new Uri("http://somedomain.com/MyService"));

任何连接到的客户端都http://somedomain.com/MyService将使用RealService合同的实现。

另一方面,假设您TestService在 IIS 中托管,位于http://somedomain.com/MyService.svc. 在这种情况下,您将拥有一个看起来像这样的 .svc 文件(类似于 Grzegorz 发布的内容):

<%@ ServiceHost Language="C#" Debug="True" Service="TestService" %>

(当我在 IIS 中托管时,我通常完全限定服务名称)。

相应的 web.config 文件可能包含以下端点:

<service name="TestService">
  <endpoint address="" binding="basicHttpBinding" contract="IUselessService" />
</service>

在这种情况下,TestService将被访问的是合约的实现。

因此,简而言之,至少在我的理解中,服务主机决定了合约的实现(通过它托管的类),并且给定的服务主机只能有一个实现。

于 2013-08-16T07:53:05.393 回答
2

如果您在 IIS 上托管您可能正在使用指向文件的端点地址,例如“Useless.svc”。在这个文件里面你配置实现:

<%@ ServiceHost Language="C#" Debug="true" Service="TestService" CodeBehind="TestService.cs" %>

或者您可以创建一个自定义ServiceHostFactory以根据 url 或配置提供不同的实现。

于 2013-08-16T07:37:39.920 回答