7

以下は、ホスト Windows サービスの app.config ファイル スニペットです。

<services>
      <service name="Share.Services.MainService">
        <endpoint address="net.tcp://localhost:8001/MainService" behaviorConfiguration="netTcpBehavior" binding="netTcpBinding" contract="Share.Services.IClaimService" />
      </service>
      <service name="Share.Services.MainMasterPageService">
        <endpoint address="net.tcp://localhost:8001/MainMasterPageService" behaviorConfiguration="netTcpBehavior" binding="netTcpBinding" contract="Share.Services.IMainMasterpageService" />
      </service>
      <service name="Share.Services.SMSService">
        <endpoint address="net.tcp://localhost:8001/SMSService" behaviorConfiguration="netTcpBehavior" binding="netTcpBinding" contract="Share.ServiceContracts.Messaging.ISMSService" />
      </service>
    </services>

ポート 8001 で TCP エンドポイントを使用するように構成された 3 つの wcf サービスがあります。Windows サービスでは、以下のコードを使用してサービス ホストを登録しています。

private static ServiceHost[] Hosts = null;

public static void Start()
{     
    try
    {
        while (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        {
            System.Threading.Thread.Sleep(1000);
        }
        BaseLog.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        Hosts = new ServiceHost[] 
            {
                new ServiceHost(typeof(MainService)), 
                new ServiceHost(typeof(MainMasterPageService)),
                new ServiceHost(typeof(SMSService)) 
            };

        foreach (ServiceHost host in Hosts)
        {
            RegisterServiceHost(host);
        }

        _log.Info("All Hosts Open");
    }
    catch(Exception e)
    {
        _log.Error( "MainServiceHost", e);
    }
}

RegisterServiceHost 関数を呼び出している ServiceHost オブジェクトごとに、この関数のコードは次のとおりです。

public static void RegisterServiceHost(ServiceHost host)
{
    var ops = (from e in host.Description.Endpoints
            from o in e.Contract.Operations
            select o).ToList();

    ops.ForEach(
        operation => operation.Behaviors.Add(new MainContextOperationBehavior())
            );

    host.Open();
}

上記のコードは問題なく正しく動作しています。私の質問は、すべてのサービスが同じポート 8001 を共有しているということです。すべてのサービスが同じポートを共有できる方法を教えてください。Net.TCP ポート共有サービスでさえ、マシンで有効になっていません。私のもう1つの質問は、同じポートを共有する際にパフォーマンスに影響を与えるかということです. 各サービスに 8001、8002、8003 のような一意のポートを指定した場合、その利点は何ですか。

4

1 に答える 1

7

それらはすべて異なるパスを持っているため、同じポートを共有できます。明らかにすべてが機能するため、WCF ホストは、ポート 8001 で同じリッスン ソケットを共有する方法を理解するのに十分なほどインテリジェントです。要求には WCF の一部であるサービス名が含まれるため、要求を区別できます。エンドポイント構成。

これがパフォーマンスの問題を引き起こすとは思いませんが、それは WCF サービス ホストの動作に完全に依存します。

于 2013-03-27T15:11:50.247 に答える