7

サービスの構成ファイルで指定されたエンドポイントを持つ WCF Windows サービスがあります。

<baseAddresses>
    <add baseAddress="net.tcp://localhost:9000/MyEndpoint"/>
</baseAddresses>

すべて正常に動作します。ただし、場合によっては、ポート 9000 が既に使用されている可能性があり、そのために ServiceHost が Open() でフォールオーバーします。構成ファイルで指定されたデフォルトのベースアドレスをコードで上書きできるようにする必要があります。たとえば、環境変数に使用するポート番号が含まれているとします。

これをプログラムで行う方法はありますか?

ServiceHost が構築された後、構成ファイルから取得した Uri リストを返す BaseAddresses プロパティを確認できます。ただし、これは読み取り専用のコレクションであるため、デフォルトの変更には使用できません。

ServiceHost コンストラクターで置換 Uri を指定すると、次のようになります。

このコレクションには、スキーム net.tcp のアドレスが既に含まれています。このコレクションには、スキームごとに 1 つのアドレスしか存在できません。サービスが IIS でホストされている場合は、'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' を true に設定するか、'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters' を指定することで問題を解決できます。

CustomServiceHost を作成し、置換ベース アドレスを設定しようとすると、同じエラーが発生します。

class CustomHost : ServiceHost
{
    public CustomHost(Type serviceType) : base (serviceType)         
    {
    }
    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();

        this.AddBaseAddress(new Uri("net.tcp://localhost:9010/MyEndpoint"));
    }
}

構成ファイルのベース アドレスを空白のままにして、そのベース アドレスを ServiceHost コンストラクターに渡すと、問題なく動作することがわかっています。つまり、新しいベースを指定できます。ただし、(ハードコーディングの代わりに) 構成ファイルを使用してデフォルトを指定したいと考えています。

4

1 に答える 1

5

私が投稿したこの例を見てください。コードを介して完全に構成された WCF サービスの完全な動作例があります。次に、Environment.GetEnvironmentVariable を使用してポート番号を取得し、それを ServiceHost のコンストラクターに渡すことができるはずです。

同じコントラクト、同じバインディング、同じアドレス、しかし異なるポートを持つことは可能ですか?

于 2010-07-07T17:05:04.393 に答える