私の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 サンプルのように) localhost を使用する必要があるかもしれませんが、問題を引き起こすのは私のクライアント接続コードです。
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
ポイントは、ベースアドレスのホスト名を * 記号 (ワイルドカード) に置き換えることです。実行時に実際のホスト名に変更されます。
まだすべてをテストしていませんが、実際に機能しているようです。