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 スキームで 2 つのアドレスを検出するため、例外が発生して失敗します。

また、実行中のインスタンスに応じて、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 に答える