覆盖配置文件代码中的WCF基地址
我有一个WCF Windows服务,并在服务的配置文件中指定了端点。覆盖配置文件代码中的WCF基地址
<baseAddresses>
<add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>
一切正常。但是,在某些情况下,可能已经使用了端口9000,导致ServiceHost在Open()上崩溃。 我需要能够在代码中覆盖配置文件中指定的默认基地址。例如假定环境变量包含要使用的端口号。
有没有办法以编程方式做到这一点?
在构建ServiceHost后,我可以看到BaseAddresses属性,它返回从配置文件中取得的Uri列表。但是,这是一个只读集合,因此不能用于更改默认值。
如果我在ServiceHost的构造函数中指定的替换乌里我得到
此集合已经包含了 地址与方案的net.tcp。在这个集合中, 可以是每个方案最多一个地址 。如果您的服务是 在IIS所驻留您可以通过设置 “system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled”为真或指定 “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的构造函数,然后工作正常 - 即我可以指定新的基地。但是,我想使用配置文件来指定默认值(而不是硬编码)。
看看我发布的这个例子。它有一个完整的通过代码配置的WCF服务的工作示例。你应该能够再只是用Environment.GetEnvironmentVariable抢的端口号,并将其传递到的ServiceHost的构造函数:
Possible to have same contract, same binding, same address, but different ports?