2012-05-25 16 views
7

Voglio ospitare un servizio WCF su Azure, ma questo esemplificazione deve essere dinamica, quindi voglio istanziare nuovi servizi come necessario però ...Come ospitare servizio WCF di programmazione su Azure

new ServiceHost(new Service(),<<What the heck is the base URI!?>>)

Quello che dovrebbe essere alla base di Uri (Schema, nomeserver & porto) su:

  1. Un ruolo lavoratore
  2. Un ruolo web
    • Punto finale esterno
    • Punto finale interno. (Alcuni servizi hanno bisogno di parlare gli uni agli altri dietro di bilanciamento del carico per motivi di prestazioni, ma come?)

sono anche questi possibili:

  1. Più di un ServiceHost per ogni ruolo web .
  2. Collegamento endpoint variabile, ad es. Voglio un servicehost su Http, un altro Net.tcp in caso affermativo dovrò dichiarare entrambi i protocolli nel file csdef al momento della distribuzione, oppure posso aggiungerli come necessario a livello di programmazione (ovvero, late bind)?

Sto cercando una soluzione che non riguardi ServiceBus per ragioni di $$$.

risposta

4

L'approccio sarebbe lo stesso, sia su istanze di ruolo Web o ruolo di lavoro, poiché entrambi sono essenzialmente Windows 2008 Server (solo che i ruoli Web hanno IIS in esecuzione, che consuma anche alcune porte). Indipendentemente dalla porta su cui desideri appendere i servizi wcf, è sufficiente definirli come endpoint di input (un endpoint per porta) e decidere anche quale ruolo gestisce quell'endpoint.

Finché sono disponibili porte, è possibile disporre di più ServiceHosts. Attualmente sei limitato a 25 endpoint di input totali e 25 endpoint interni totali per distribuzione, quindi questo è il tuo limite assoluto. Ovviamente, se abiliti RDP, il numero di porte disponibili diminuisce. Oh: per quanto riguarda i protocolli: se si desidera sia http e tcp, è necessario definire due endpoint, in quanto il protocollo è definito con la definizione di endpoint.

I servizi WCF dell'endpoint interno sono praticamente identici, ma è possibile eliminare la sicurezza e utilizzare net.tcp per un trasferimento rapido. Una differenza di bilanciamento del carico però:

  • un servizio WCF appeso su un ingresso Endpoint sarà carico bilanciato in tutte esempio di un ruolo
  • un servizio WCF appeso su un endpoint interno sarà non essere carico -equilibrato.

Per il secondo caso: diciamo che il tuo ruolo Web deve comunicare con il servizio WCF del ruolo di lavoro su endpoint interno. Dovresti enumerare tutte le istanze, ottenere la porta IP + di ciascuna, quindi selezionarne una a caso (o round-robin, o qualunque metodo tu scelga).Ecco un metodo di esempio che restituisce un'istanza casuale endpoint da un determinato ruolo e nome dell'endpoint (codice preso in prestito da Michael Washam di blog):

private String GetRandomServiceIP(String roleName, String endPointName) 
{ 
    var endpoints = RoleEnvironment.Roles[roleName].Instances.Select(i => i.InstanceEndpoints[endPointName]).ToArray(); 
    var r = new Random(DateTime.Now.Millisecond); 
    int ipIndex = r.Next(endpoints.Count()); 
    return endpoints[ipIndex].IPEndpoint.Address.ToString(); 
} 

Per quanto riguarda la configurazione del servizio WCF e legato URI, avrei fortemente suggerire di afferrare l'ultimo Windows Azure Training Kit e di camminare attraverso il laboratorio di comunicazione Worker Role, che contiene molti dettagli sull'impostazione di un ServiceHost, con endpoint di input e endpoint interni.

+0

Vedo cosa stai dicendo. Se potessi chiederne qualcun altro, come potrei ripetere tutte le istanze? Puoi nominare la classe? Inoltre non vedo alcuna proprietà che possa aiutarmi a distinguere tra endpoint interno e esterno nella classe 'RoleInstanceEndpoint' – Alwyn

+1

Ho modificato la mia risposta per mostrare un esempio di enumerazione di un endpoint di un ruolo. Dovrai conoscere i nomi dei tuoi endpoint - nulla di specifico ti dice se l'endpoint interno o di input. –

+0

Grazie, è quello che stavo cercando. Apprezzo il tuo tempo! – Alwyn

Problemi correlati