在代码中覆盖配置文件WCF Base Addresses

时间:2010-06-21 15:52:10

标签: c# .net wcf wcf-endpoint

我有一个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'   为真或指定   '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 个答案:

答案 0 :(得分:5)

看看我发布的这个例子。它有一个完全通过代码配置的WCF服务的完整工作示例。您应该能够使用Environment.GetEnvironmentVariable获取端口号并将其传递给ServiceHost的构造函数:

Possible to have same contract, same binding, same address, but different ports?