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