2

在我的 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”但没有成功。

那么如果我希望能够在不同的计算机上运行服务而不需要重新编译,我应该使用什么作为主机地址呢?我应该将地址存储在每台计算机的配置文件中,还是应该在运行时更改地址?我想,我在这里遗漏了一些简单而基本的东西。

或者也许我应该使用 localhost (就像在许多 wcf 示例中一样),这是我的客户端连接代码带来了问题:

EndpointAddress endpointAddress = findResponse.Endpoints[0].Address;
OpdChannelFactory = new DuplexChannelFactory<OpdServiceReference.IOpdService>(CallbackHandler,
                        new NetTcpBinding("MainEndPoint"), endpointAddress);

同样,当我使用“localhost”作为基地址时,“localhost”作为findResponse.

编辑:

好像我在这里找到了解决方案:http : //btw-blog.blogspot.com/2011/02/dynamic-base-address-for-wcf-service.html

关键是将基地址中的主机名替换为 * 符号(通配符)。它将在运行时使用实际主机名进行更改。

还没有测试一切,但看起来它确实有效。

4

2 回答 2

6

好像我在这里找到了解决方案:http: //btw-blog.blogspot.com/2011/02/dynamic-base-address-for-wcf-service.html

关键是用“*”符号(通配符)替换基地址中的主机名。它将在运行时使用实际主机名进行更改。

对其进行了测试,效果很好。

于 2012-05-21T06:10:33.590 回答
2

现在您的服务端点地址是:

net.tcp://jerrycan:8000/service

当您在托管服务(jerrycan-pc)的计算机上创建客户端时,本地客户端当然可以通过引用来访问该服务

net.tcp://localhost:8000/service

显然,如果其他客户端(在您网络上的其他计算机上)尝试联系localhost ,则无法连接到该服务,因为端点:正在调用本地计算机,在这种情况下该计算机未托管该服务(仅适用于 jerrycan-pc )。如果是托管服务,则客户端可以通过引用来调用服务,但客户端必须尝试调用或的 IP。如果您将服务配置中的端点更改为您的服务主机 IP 甚至计算机名称,并使用服务主机/计算机名称的 IP 引用其他计算机上的服务,那么他们将能够访问它。例如,如果 jerrycan-pc 托管服务并且它的 IP 为net.tcp://localhost:8000/servicejerrycan-pcjerrycan-pclocalhostmike-pcjerrycan-pcjerrycan-pc192.168.1.5,您的客户端可以通过引用此端点来使用服务:

net.tcp://192.168.1.5:8000/service

因此,在您的服务配置中更改localhost为 IP 地址或 PC 名称,并尝试在您的客户端上联系该地址,而不是联系localhost.

于 2012-05-18T09:18:09.337 回答