サービスの構成ファイルで指定されたエンドポイントを持つ WCF Windows サービスがあります。
<baseAddresses>
<add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>
すべて正常に動作します。ただし、場合によっては、ポート 9000 が既に使用されている可能性があり、そのために ServiceHost が Open() でフォールオーバーします。構成ファイルで指定されたデフォルトのベースアドレスをコードで上書きできるようにする必要があります。たとえば、環境変数に使用するポート番号が含まれているとします。
これをプログラムで行う方法はありますか?
ServiceHost が構築された後、構成ファイルから取得した Uri リストを返す BaseAddresses プロパティを確認できます。ただし、これは読み取り専用のコレクションであるため、デフォルトの変更には使用できません。
ServiceHost コンストラクターで置換 Uri を指定すると、次のようになります。
このコレクションには、スキーム net.tcp のアドレスが既に含まれています。このコレクションには、スキームごとに 1 つのアドレスしか存在できません。サービスが IIS でホストされている場合は、'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' を true に設定するか、'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters' を指定することで問題を解決できます。
CustomServiceHost を作成し、置換ベース アドレスを設定しようとすると、同じエラーが発生します。
class CustomHost : ServiceHost
{
public CustomHost(Type serviceType) : base (serviceType)
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
this.AddBaseAddress(new Uri("net.tcp://localhost:9010/MyEndpoint"));
}
}
構成ファイルのベース アドレスを空白のままにして、そのベース アドレスを ServiceHost コンストラクターに渡すと、問題なく動作することがわかっています。つまり、新しいベースを指定できます。ただし、(ハードコーディングの代わりに) 構成ファイルを使用してデフォルトを指定したいと考えています。