我试图主机基址启动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地址时,取决于正在运行的实例?如果我迷失在黑客的迷宫中,请回到主路上。
这就是它现在的工作原理。我特别有兴趣知道是否可以通过编程方式修改有机WCF配置而不实际将其保存在磁盘上。 – mark 2010-12-11 20:06:27