我有一个WCF Windows服务,在服务的配置文件中指定了 endpoints .
<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构造函数,那么这样可以正常工作 - 即我可以指定新的基数 . 但是,我想使用配置文件来指定默认值(而不是硬编码) .
1 回答
看看我发布的这个例子 . 它有一个完全通过代码配置的WCF服务的完整工作示例 . 您应该能够使用Environment.GetEnvironmentVariable获取端口号并将其传递给ServiceHost的构造函数:
Possible to have same contract, same binding, same address, but different ports?