我有一个 WCF Windows 服务,其端点在服务的配置文件中指定。
<baseAddresses>
<add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>
一切正常。但是,在某些情况下,端口 9000 可能已经在使用中,这会导致 ServiceHost 在 Open() 上失败。我需要能够覆盖代码中配置文件中指定的默认基地址。例如,假设环境变量包含要使用的端口号。
有没有办法以编程方式做到这一点?
构建 ServiceHost 后,我可以看到 BaseAddresses 属性,它返回从配置文件中获取的 Uri 列表。但是,这是一个只读集合,因此不能用于更改默认值。
如果我在 ServiceHost 构造函数中指定替换 Uri 我得到
此集合已经包含一个带有方案 net.tcp 的地址。此集合中的每个方案最多可以有一个地址。如果您的服务托管在 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 构造函数,那么它工作正常 - 即我可以指定新的基址。但是,我想使用配置文件来指定默认值(而不是硬编码)。