我尝试在启动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地址时,取决于正在运行的实例?如果我迷失在黑客的迷宫中 - 请显示返回主干道的路。
答案 0 :(得分:0)
想到一个真正简单的方法。如果你已经有一个连接到实例的方法,如果没有基地址,我会删除基地址。然后我将基地址和默认实例名称放入app.config appsetings部分。然后在代码中组合在命令行给出的基地址和实例名称,或者如果没有给出实例名称,则使用appSettings中的DefaultInstance名称。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="BaseAddress" value="http://localhost:8001/" />
<add key="DefaultInstance" value="MyAgent" />
</appSettings>
</configuration>
只是为了完全公开,您可以使用此代码轻松阅读这些值。
System.Configuration.ConfigurationManager.AppSettings["BaseAddress"]