2013-03-27 7 views
7

Poniżej znajduje się mój fragment pliku app.config usługi hosta systemu Windows.Obsługa wielu usług WCF na jednym porcie TCP w jednej usłudze systemu Windows

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

Istnieją 3 usługi WCF skonfigurowane do korzystania z portu TCP końcowy 8001. W usługi windows używam poniżej kodu Rejestracja Serwis gospodarze

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

Dla każdego obiektu ServiceHost Wołam funkcję RegisterServiceHost , kod tej funkcji jest poniżej:

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

Powyższy kod działa poprawnie bez żadnych problemów. Moje pytanie jest takie, że wszystkie usługi dzielą ten sam port 8001. Jak wszystkie usługi mogą współdzielić ten sam port. Nawet usługa udostępniania portów Net.TCP nie jest włączona na komputerze. Moje inne pytanie jest takie, że spowoduje to wpływ wydajności na udostępnianie tego samego portu. JEŚLI daję unikalny port, jak 8001,8002, 8003 dla każdej usługi, to co jest tego zaletą.

Odpowiedz

7

Mogą one udostępniać ten sam port, ponieważ wszystkie mają różne ścieżki. Oczywiście wszystko działa, więc host WCF jest na tyle inteligentny, aby dowiedzieć się, jak sprawić, by korzystały z tego samego gniazda nasłuchującego na porcie 8001. Może wtedy rozróżniać żądania, ponieważ żądania będą zawierać nazwę usługi, która jest częścią WCF. konfiguracja punktu końcowego.

Nie spodziewałbym się, że spowoduje to jakiekolwiek problemy z wydajnością, ale to zależy całkowicie od sposobu działania hosta usługi WCF.

Powiązane problemy