这可能是this的副本,但收到的答案没有回答我的查询,而且我也无法在网上找到它。
以上面提到的问题给出的例子,当我在客户端创建端点时,我写了一个端点,以契约作为接口。因此,我在客户端的端点将类似于以下内容。
<client>
<endpoint name="MyClientEndpoint" address="http://..." binding="basicHttpBinding"
contract="IUselessService" />
</client>
同样在客户端的代码中,我创建代理的对象并调用方法,即GetData
。
所以我的问题是这个类会被调用的方法吗? TestService
或RealService
?因为客户端无处,我提到应该调用哪个类的方法。
我确信在WCF中会有一些设置,以确保调用正确类的方法,但我无法找到它。
另外我对WCF有点新意,所以如果我在任何地方都错了,请纠正我。
提前致谢。
此致
萨马
答案 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以根据网址或配置提供不同的实现。