【问题标题】:Overriding config file WCF Base Addresses in code在代码中覆盖配置文件 WCF 基地址
【发布时间】:2011-03-06 09:30:24
【问题描述】:

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

<baseAddresses>
    <add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>

一切正常。但是,在某些情况下,端口 9000 可能已经在使用中,这会导致 ServiceHost 在 Open() 上失败。 我需要能够覆盖代码中配置文件中指定的默认基地址。例如假设环境变量包含要使用的端口号。

有没有办法以编程方式做到这一点?

构造 ServiceHost 后,我​​可以看到 BaseAddresses 属性,它返回从配置文件中获取的 Uri 列表。但是,这是一个只读集合,因此不能用于更改默认值。

如果我在 ServiceHost 构造函数中指定替换 Uri,我会得到 ​​p>

此集合已包含一个 使用方案 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 构造函数,那么它工作正常 - 即我可以指定新的基址。但是,我想使用配置文件来指定默认值(而不是硬编码)。

【问题讨论】:

    标签: c# .net wcf wcf-endpoint


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2013-10-18
      相关资源
      最近更新 更多