I have a WCF Windows service with an endpoint specified in the config file for the service.
<baseAddresses>
<add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>
All works ok. However, in some cases port 9000 might already be in use which causes the ServiceHost to fall over on Open(). I need to be able to OVERRIDE the default base address specified in the config file in code. e.g. assume an environment variable contains the port number to be used.
Is there any way to do this programmatically?
After the ServiceHost is constructed I can see the BaseAddresses property which returns the Uri list taken from the config file. However, this is a read only collection so can't be used to change the defaults.
If I specify a replacement Uri in the ServiceHost constructor I get
This collection already contains an address with scheme net.tcp. There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.
If I create a CustomServiceHost and try and set the replacement base address I get the same error.
class CustomHost : ServiceHost
{
public CustomHost(Type serviceType) : base (serviceType)
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
this.AddBaseAddress(new Uri("net.tcp://localhost:9010/MyEndpoint"));
}
}
I know that if I leave the config file base addresses blank and pass the base address into the ServiceHost constructor then that works fine - i.e. I can specify the new bases. However, I want to use the config file to specify the default (instead of hard coding).