9

同じマシンで複数の WCF サービス ホスティング アプリを実行しようとしています。

1 つのアプリケーションで複数のサービスを実行するのではなく、複数のアプリケーションを実行したい。

var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISomeInterface),  new NetNamedPipeBinding(), "FOO");
host.Open();

アプリごとに「FOO」を変更していますが、それでも複数のサービスを起動できません。それはかなり単純だと思いますが、行き詰まっています:(

よろしく

4

2 に答える 2

8

このようにアプローチすることで、あなたが望むことを実行できると私は信じています。

string relativeUriPart = GetUniquePartFromConfigOfThisApplicationInstance();
var host = new ServiceHost(typeof(MyClass1)); // No base addresses specified
host.AddServiceEndpoint(
    typeof(ISomeInterface),  
    new NetNamedPipeBinding(), 
    "net.pipe://localhost/" + relativeUriPart); // Specify absolute URI for endpoint
host.Open();

これは、net.pipeスキームを使用するベースアドレスを指定した場合、リスナーが使用するパイプ名を導出するために使用されるのはこのベースアドレスであり[以下の編集を参照]、これは各アプリケーションインスタンスで同じであるためです。最初のアプリケーションのリスナーはパイプを作成できます-あなたが指摘したように、他のリスナーは失敗します。

ベースアドレスなしでエンドポイントレベルの絶対URIを使用して、リスナーは完全な絶対URIから派生したパイプ名で作成されます[以下の編集を参照]。これは各アプリケーションインスタンスで異なります。したがって、各アプリケーションのリスナーは問題なく独自のパイプを所有しています。


編集:より正確には、パイプ名自体はサービスアドレスからまったく派生していません。これは、サービスが開かれるたびに変更されるGUIDです。サービスアドレスから派生するの、パイプの実際の名前が見込み顧客に公開される共有メモリオブジェクトの名前です。詳細については、こちらをご覧ください。

于 2011-03-17T10:17:47.420 に答える
0

ここに示すように、さまざまなサービス契約のサービスホストを作成する必要がある場合:

...    
host1 = new SeviceHost(typeof(MyClass1, ...);
host2 = new ServiceHost(typeof(MyClass2, ...);
...

次に、Mathewの回答が示唆するように、新しいServiceHostごとに異なるベースアドレスを使用する必要があります。すべてのサービスホストが同じtypeof(MyClass1)用である場合は、同じサービスに対して複数のエンドポイントを作成する必要がある場合があります。各エンドポイントは、そのサービスの異なるインターフェイス(つまり、ISomeInterface1、ISomeInterface2、...)用である可能性があります。

于 2011-03-16T14:19:34.573 に答える