4

C# のコンソール アプリケーションから実行されている「ワーカー」サービスがあります。開発のために、データのチャンクを取得していくつかの計算を実行するこのサービスの単一のインスタンスを常に実行していました。これらのデータのチャンクは別のサービスによって提供されます (追跡します)。データの残量など)

QA では、「worker」サービスの複数のインスタンスを同時に (同じマシン上で) 実行したいと考えています。ただし、2 番目のインスタンスが起動されるとすぐに例外が発生します。

TransportManager は、NetTcpPortSharing サービスを使用して提供された URI をリッスンできませんでした: URI は既にサービスに登録されています。

私たちは netTcpBinding を使用しており、エンドポイント アドレスは app.config にハードコードされており、同じままであるため、このエラーが発生していると思います。

<services>
    <service behaviorConfiguration="CoreBehavior" name="WorkerService">
        <endpoint address="net.tcp://localhost:8001/WorkerAssignment" binding="netTcpBinding" contract="IWorkerService" bindingConfiguration="CoreTcpBinding"/>
    </service>
</services>
<bindings>
    <netTcpBinding>
        <binding name="CoreTcpBinding" portSharingEnabled="true">
            <security mode="None"/>
        </binding>
    </netTcpBinding>
</bindings> 

アプリケーション コード :

var host = new ServiceHost(typeof(WorkerService));
host.Open();

少なくともポートが同じままになるように、インスタンスごとに異なる URI を提供するにはどうすればよいでしょうか?

または、同じサービスの複数のインスタンスを実行する別の方法がある場合は?

4

3 に答える 3

4

サービスの複数のインスタンスが必要な場合は、単一のサービス ホストで十分です。WorkerServiceServiceBehaviorAttributeで装飾するだけです。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Percall)] 
public class WorkerService : IWorkerService 
{
  //...service data
}

これにより、サービスへのすべての呼び出しで、最初にサービスの新しいインスタンスが作成されるようになります。サービス クラスを作成するその他の方法については、こちらを参照してください。

ただし、複数のサービス ホストが必要な場合は、完全に同じ URL で同じサービスをホストする 2 つのサービス ホストを使用することはできません。

もう 1 つのケースは、同じベース アドレスとカスタム URI を持つ複数のエンドポイントで同じサービスをホストする 1 つのサービス ホストが必要な場合です。この場合、オーバーロードされた ServiceHost コンストラクターを利用するか、メソッドAddBaseAddressAddServiceEndpointを調べることができます。または、構成ファイルから実行する場合は、コードをわずかに変更した簡単な例を次に示します

<service behaviorConfiguration="CoreBehavior" name="WorkerService">
    <endpoint address="WorkerAssignment" binding="netTcpBinding" contract="IWorkerService"/>
    <endpoint address="QAWorkerAssignment" binding="netTcpBinding" contract="IWorkerService"/>
  <host>
    <baseAddresses>
      <add baseAddress="net.tcp://localhost:8001/" />
    </baseAddresses>
  </host>
</service>

この構成では、サービスに 2 つのエンドポイントがあります

net.tcp://localhost:8001/WorkerAssignment

net.tcp://localhost:8001/QAWorkerAssignment

于 2012-09-13T19:08:16.540 に答える
1

ムルタザあなたはまだ複数のインスタンスが必要であり、問​​題は異なるポートを与える方法であることは正しいです

代替 1: サービスの各インスタンス: ServiceHost.Open を呼び出す前に、エンドポイントをサービスに追加できます。

ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService))
WSHttpBinding binding = new WSHttpBinding();
serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "http://localhost:8000/servicemodelsamples/service/basic");

上記のコードでは、アドレス部分はサービスのインスタンスごとに異なるポートを持つことができます。

詳細はリンク先

代替 2:ポート共有を有効にする

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>
于 2012-09-22T01:02:03.913 に答える
0

あなたはあなたを定義することができますspecific behavior

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall, 
                 ConcurrencyMode = ConcurrencyMode.Multiple)]
于 2012-09-13T19:02:56.720 に答える