2013-03-27 11 views
7

Di seguito è riportato il frammento di file app.config del servizio Windows host.Hosting di più servizi WCF su una singola porta TCP in un unico servizio 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> 

Ci sono 3 servizi WCF configurati per utilizzare TCP endpoint con la porta 8001. In servizio di Windows che sto usando qui di seguito il codice per registrare Servizio host

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

Per ogni oggetto ServiceHost sto chiamando la funzione RegisterServiceHost , il codice di questa funzione è il seguente

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

Sopra il codice funziona correttamente senza alcun problema. La mia domanda è che tutti i servizi condividano la stessa porta 8001. Come tutti i servizi in grado di condividere la stessa porta. Anche il servizio di condivisione porta Net.TCP non è abilitato sulla macchina. Un'altra domanda è che causerà un impatto sulle prestazioni nella condivisione della stessa porta. Se fornisco una porta unica come 8001,8002, 8003 per ciascun servizio, allora quali sono i vantaggi.

risposta

7

Possono condividere la stessa porta perché hanno tutti percorsi diversi. Chiaramente tutto funziona, quindi l'host WCF è abbastanza intelligente da capire come farli condividere lo stesso socket di ascolto sulla porta 8001. Può quindi distinguere tra le richieste, perché le richieste includeranno il nome del servizio che fa parte del WCF configurazione endpoint.

Non avrei previsto che ciò causerebbe problemi di prestazioni, ma ciò dipende interamente da come funziona l'host del servizio WCF.

Problemi correlati