2010-12-06 35 views
1

我试图主机基址启动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

只是想一个真正简单的方法。如果你已经有一个连接到实例的方法,如果没有基地址存在,我会删除基地址。然后我将基地址和默认实例名称放入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"] 
+0

这就是它现在的工作原理。我特别有兴趣知道是否可以通过编程方式修改有机WCF配置而不实际将其保存在磁盘上。 – mark 2010-12-11 20:06:27