ベース アドレスに を追加するために 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 哲学に従っていますか? ハックの迷宮で迷子になったら、幹線道路に戻る道を教えてください。