BlogServiceHost.Create()

WCF & Azure - Il blog di Fabio Cozzolino

Recent Posts

Tags

My

Twitter

Community

Archives

Email Notifications

Social Bar Widget

Windows Azure SDK e Compute Emulator: gestione degli indirizzi locali

Stimolato da un tweet di oggi del buon Giorgio, ho riesumato questo vecchio post che avevo in coda da un po’ di tempo.

Fino alla versione 1.4, il Compute Emulator, l’ambiente di simulazione locale dell’infrastruttura di Windows Azure, non aveva la gestione del Load Balancer e ogni istanza veniva allocata con lo stesso indirizzo IP (127.0.0.1) ma con porte differenti ed incrementali: 81, 82, 83, e così via…

Dalla versione 1.5, invece, al fine di replicare quanto più possibile l’ambiente di produzione cloud, al Load Balancer viene assegnato, se non diversamente configurato, l’IP 127.0.0.1 con la porta 81 (incrementale se già occupata), mentre ai vari nodi l’indirizzo assegnato sarà diverso, tipicamente l’IP 127.255.0.0, con la porta 82 che questa volta sarà sempre la stessa. Quattro istanze, ad esempio, saranno così suddivise:

  Indirizzo Porta
Load Balancer 127.0.0.1 81
Nodo 1 127.255.0.0 82
Nodo 2 127.255.0.1 82
Nodo 3 127.255.0.3 82
Nodo 4 127.255.0.4 82

Questa nuova modalità genera però alcune problematiche negli applicativi che recuperano l’indirizzo IP utilizzando l’HttpRequest e le proprietà come SERVER_PORT o LOCAL_ADDR. In questo caso, ovviamente, la porta e l’indirizzo sono quelle del nodo su cui l’applicativo è in esecuzione.

Per ovviare al problema è sufficiente recuperare utilizzare le proprietà host e port di Request.Uri per accedere ai relativi headers contenuti nella richiesta HTTP, che conterranno i valori corretti del load balancer proprio perchè è lì che viene inviata la richiesta:

   1: HttpRequest request = HttpContext.Current.Request;
   2: var builder = new UriBuilder(request.Url.Scheme, request.Url.Host, request.Url.Port);

Infine per comodità utilizzo un UriBuilder.

Fabio

Posted: Feb 09 2012, 07:48 PM by Fabio.Cozzolino | with no comments
Filed under: