【问题标题】:What method will get called when multiple classes implement 1 service contract interface多个类实现1个服务契约接口时调用什么方法
【发布时间】:2013-08-18 13:02:48
【问题描述】:

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

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

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

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

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

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

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

提前致谢。

问候,

萨马尔

【问题讨论】:

  • 这取决于ServiceHost 使用的是哪个实现——如果它使用的是TestService,那么将调用该实现的方法。如果它使用RealService,那么将使用RealService 中的实现。

标签: .net wcf interface


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    为了跟进我的评论,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 的合约实现。

    另一方面,假设您在 IIS 中托管 TestService,地址为 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 的合约实现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多