我正在尝试在启动 WCF 服务主机之前调整主机基地址以向instanceName
基地址添加一个:
var baseAddresses = Utils<Uri>.EmptyList;
var cfg = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None);
var serviceModelGroup = cfg.GetSectionGroup("system.serviceModel") as
ServiceModelSectionGroup;
var wcfPortalServiceElement = serviceModelGroup.Services.
Services[typeof(WcfPortal).FullName];
if (wcfPortalServiceElement != null && wcfPortalServiceElement.Host != null)
{
baseAddresses = wcfPortalServiceElement.Host
.BaseAddresses
.Cast<BaseAddressElement>()
.Select(e => new Uri(e.BaseAddress + "/" + instanceName,
UriKind.Absolute))
.ToArray();
}
该app.config
文件如下所示:
<services>
<service name="MyCompany.Common.Csla.WcfPortal"
behaviorConfiguration="serviceBehavior">
<endpoint contract="Csla.Server.Hosts.IWcfPortal"
binding="customBinding"
bindingConfiguration="compressed_httpConfig"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/MyAgent" />
</baseAddresses>
</host>
</service>
</services>
动机:我希望能够在同一台机器上多次运行相同的代理进程。每个实例都有不同的名称(在命令行中给出),应包含在主机基地址中。现在,如果 app.config 根本不包含 baseAddresses 集合,这很容易做到。但是,我希望它存在,以防在没有给出实例名称的情况下运行单个代理进程。
问题是服务主机将其构造函数中给出的基地址与出现在 app.config 中的基地址合并。自然它会因异常而失败,因为它使用 http 方案发现了两个地址。
另外:在尝试根据正在运行的实例修改 WCF 地址时,我是否遵循主流的 WCF 理念?如果我迷失在黑客的迷宫中——请指路回到主干道。