2013-03-27 13 views
7

以下は、ホストWindowsサービスの私のapp.configファイルスニペットです。1つのWindowsサービスの単一のTCPポートで複数のWCFサービスをホストする

<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> 

私はRegisterServiceHost関数を呼び出しています、すべてのServiceHostオブジェクトの場合

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); 
    } 
} 

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

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ポート共有サービスでも、マシン上で有効になっていません。 私の他の質問は、同じポートを共有するとパフォーマンスに影響を与えます。私は8001,8002,8003のようなユニークなポートを各サービスに与えると、その利点は何ですか?

答えて

7

これらのポートはすべて異なるパスを持っているため、同じポートを共有できます。 WCFホストは、ポート8001上で同じリスンソケットを共有する方法を理解するのに十分なインテリジェントなので、リクエストにはWCFの一部であるサービス名が含まれるため、リクエストを区別することができますエンドポイントの設定。

これはパフォーマンス上の問題を引き起こすことはないと思いますが、それはWCFサービスホストの仕組みに完全に依存しています。

関連する問題