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 理念?如果我迷失在黑客的迷宫中——请指路回到主干道。

4

1 回答 1

0

只是想一个真正简单的方法。如果您已经有了连接到实例的方法(如果不存在基地址),我会删除基地址。然后我会将基地址和默认实例名称放入 app.config appsettings 部分。然后在代码中结合命令行中给出的基地址和实例名称,或者如果没有给出实例名称,则使用 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"]
于 2010-12-10T16:52:22.643 回答