当多个类实现1个服务契约接口时,将调用什么方法

时间:2013-08-16 07:23:58

标签: .net wcf interface

这可能是this的副本,但收到的答案没有回答我的查询,而且我也无法在网上找到它。

以上面提到的问题给出的例子,当我在客户端创建端点时,我写了一个端点,以契约作为接口。因此,我在客户端的端点将类似于以下内容。

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

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

所以我的问题是这个类会被调用的方法吗? TestServiceRealService?因为客户端无处,我提到应该调用哪个类的方法。

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

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

提前致谢。

此致

萨马

2 个答案:

答案 0 :(得分:3)

要跟进我的评论,ServiceHost将主持合同的具体实施。确定服务合同的实现是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执行将要访问的合同。

因此,简而言之,至少根据我的理解,服务主机确定合同的实施(通过它托管的类),并且给定的服务主机只能有一个实现。

答案 1 :(得分:2)

如果您在IIS上托管您可能正在使用指向文件的端点地址,如“Useless.svc”。 在此文件中您可以配置实现:

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

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