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

Mar*_*son 7 .net c# wcf wcf-endpoint

我有一个WCF Windows服务,在服务的配置文件中指定了端点.

<baseAddresses>
    <add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,在某些情况下,端口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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道,如果我离开这个配置文件基址的空白,并通过基址到ServiceHost的构造函数,然后是正常工作 - 即我可以指定新的基地.但是,我想使用配置文件来指定默认值(而不是硬编码).

小智 5

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

可能有相同的合同,相同的绑定,相同的地址,但不同的端口?