在我的App.config中,我指定了这个基址("jerrycan"是我的计算机的名称(:
<service behaviorConfiguration="helloWorldServiceBehavior" name="OpdService.OpdService">
<endpoint address="/service" binding="netTcpBinding" bindingConfiguration="NewBinding0"
name="MainEndPoint" contract="OpdService.IOpdService">
<identity>
<dns value="jerrycan" />
</identity>
</endpoint>
<endpoint kind="udpDiscoveryEndpoint" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://jerrycan:8000" />
<add baseAddress="http://jerrycan/service" />
</baseAddresses>
<timeouts openTimeout="00:00:15" />
</host>
</service>
在我在其他计算机上运行服务之前一切正常 - 客户端可以通过UDP发现找到服务,但无法连接,因为服务继续发送旧地址。当我将"jerrycan"更改为"localhost"时,只有本地客户端能够连接到服务(但在任何计算机上(。其他计算机上的任何客户端都尝试连接到"本地主机",但没有成功。
那么,如果我希望能够在不同的计算机上运行服务而无需重新编译,我应该使用什么作为主机地址?我应该将地址存储在每台计算机的配置文件中的某个位置,还是应该在运行时更改地址?我想,我在这里错过了一些简单而基本的东西。
或者也许我应该使用 localhost(就像在许多 wcf 示例中一样(,是我的客户端连接代码带来了问题:
EndpointAddress endpointAddress = findResponse.Endpoints[0].Address;
OpdChannelFactory = new DuplexChannelFactory<OpdServiceReference.IOpdService>(CallbackHandler,
new NetTcpBinding("MainEndPoint"), endpointAddress);
同样,当我使用"本地主机">作为基址时,"本地主机"在findResponse
中作为端点地址出现。
编辑:
似乎我在这里找到了解决方案:http://btw-blog.blogspot.com/2011/02/dynamic-base-address-for-wcf-service.html
关键是将基址中的主机名替换为 * 符号(通配符(。它将在运行时更改为实际主机名。
尚未测试所有内容,但看起来它确实有效。
似乎我在这里找到了解决方案:http://btw-blog.blogspot.com/2011/02/dynamic-base-address-for-wcf-service.html
关键是将基址中的主机名替换为"*"符号(通配符(。它将在运行时更改为实际主机名。
测试了它,效果很好。
现在,服务终结点地址为:
net.tcp://jerrycan:8000/service
当您在托管服务的计算机上创建客户端(jerrycan-pc(时,本地客户端当然可以通过引用来访问服务
net.tcp://localhost:8000/service
显然,如果其他客户端(在网络上的其他计算机上(尝试联系 localhost,则无法连接到该服务,因为端点:net.tcp://localhost:8000/service
正在调用本地计算机,在这种情况下,该计算机不托管服务(仅适用于 jerrycan-PC(。如果jerrycan-pc
托管服务,jerrycan-pc
上的客户端可以通过引用localhost
来调用服务,但mike-pc
上的客户端必须尝试调用jerrycan-pc
或jerrycan-pc
的IP。如果将服务配置中的终结点更改为服务主机 IP 甚至计算机名称,并使用服务主机/计算机名称的 IP 在其他计算机上引用该服务,则它们将能够访问该服务。例如,如果 jerrycan-pc 托管服务并且它的 IP 为 192.168.1.5
,则客户端可以通过引用此终结点来使用该服务:
net.tcp://192.168.1.5:8000/service
因此,在您的服务配置中,将localhost
更改为 IP 地址或 PC 名称,并尝试联系客户端上的该地址,而不是联系localhost
。