2012-08-15 18 views
6

Trabajando con el SDK Azure de junio de 2012, Visual Studio 2010 e IIS Express, tengo una aplicación web que se ha ejecutado en 127.255.0.2. Estoy usando ACS para la autenticación, y mi aplicación está configurada como una parte confiable en esta IP. Agregué una nueva función de trabajador a mi solución y, por alguna razón, esto ha llevado la dirección IP de mi aplicación web a 127.255.0.3. Esta es la tercera vez que los cambios en otras partes de la solución han cambiado esta IP, y me estoy cansando de tener que agregar nuevas configuraciones de terceros y volver a ejecutar el asistente de STS.Emulador de cálculo de Azure: ¿es posible controlar la IP de las instancias individuales?

¿Hay alguna manera formal de controlar qué función emulada se vincula a qué IP? Y si no lo hay, ¿el orden de inicio/enlace es el mismo que el de los proyectos en la carpeta Roles, y si es así, llamar a mi rol web algo así como Aardvark asegura que siempre sea el primero en vincular?

+0

En respuesta parcial a mi propia pregunta: sí, cambiar el nombre de mi MVC Web Project (que también cambia el nombre de la función) a algo así como "_web" lo coloca en la parte superior de la lista y significa que se une consistentemente a 127.255.0.0. Todavía estoy interesado si hay una mejor manera de hacer esto, sin embargo, ya que esto se siente como un truco. – JcFx

Respuesta

4

¿Por qué le gustaría cambiar esa dirección IP? Esto se usa solo internamente para evitar conflictos de IP/Puerto. Todos sus roles solo se acceden a través de 127.0.0.1:[port] y esta es la dirección que debe usar como dirección base de su aplicación de terceros. Las direcciones 127.255.0.XX son direcciones internas que se encuentran detrás del emulador de carga emulado del emulador de cómputo.

No hay forma formal ni informal de controlar la dirección IP de instancia/rol de la instancia para Compute Emulator. Además, incluso si hubiera una manera de hacerlo, ¡no sugeriría usarlo!

Siempre puede obtener la dirección IP correcta y el puerto de cualquier punto final configurado en su servicio en la nube a través de la propiedad RoleEnvironment.CurrentRoleInstance.InstanceEndpoints.

Lee sobre IP Address and Port allocation here.

ACTUALIZACIÓN

pesar de que su aplicación está destinada a 127.255.0.XX (Dirección IP directa emulado, también conocido como DIP) en el IIS Express, la llamada real para su aplicación deberá pasar por 127.0.0.1:81 (Dirección IP virtual emulada, también conocida como VIP) (donde solo cambia el puerto). Y esta es la página de carga predeterminada cuando Visual Studio inicia su aplicación. El Fabric de desarrollo (a.k.a. Compute Emulator) ha emulado Load Balancer, que escucha en 127.0.0.1:81 (VIP emulado) y redirige traffinc a las instancias apropiadas, que se distribuyen en 127.255.0.XX (DIP emulado). Es por eso que siempre debe usar 127.0.0.1 cuando se trabaja con el emulador de cómputo y cuando se configura la parte dependiente de ACS. Cualquier otra cosa que hagas está mal y no representa el entorno Azure.

Puede leer this y that entradas de blog para comprender la recordación y la creación de redes en Windows Azure.

+1

No quiero cambiarlo, solo quiero que sea consistente, así que mi ACS aún funciona. ACS está configurado externamente, en la consola de administración, por lo que RoleEnvironment no sirve de nada. "Todos sus roles solo se acceden a través de 127.0.0.1:[port]"; esto no es correcto. 127.0.0.1 apunta a algo completamente diferente en mi sistema (sitios de ejecución de IIS regulares como localhost). – JcFx

+0

cuando trabaje localmente con Compute Emulator, su dirección base para su Parte que Confía en ACS será http://127.0.0.1:[onnport]/Donde 127.0.0.1 nunca cambia, dependiendo del número de roles/instancias que tenga/agregar eliminar. Y el puerto dependerá de la disponibilidad del puerto, pero generalmente es 81, porque 80 está ocupado ejecutando IIS (completo). – astaykov

+0

Extraño: IIS express lo hace disponible tanto en 127.0.0.1:82 (como dices) como en 127.255.0. * - donde * se incrementa con cada Rol.No me di cuenta de que el enlace anterior estaba allí, ya que el segundo funciona perfectamente (incluido Role Discovery, etc., por lo que definitivamente se emula). De todos modos: marcado como respuesta. Gracias por la asistencia rápida. – JcFx

6

No sé si mi experiencia coincide exactamente con el escenario descrito, pero creo que puede, al menos, ser una inspiración.

En mi solución tengo cuatro servicios distintos en la nube, cada uno tiene un rol web, y todos deben saber que la URL de otros servicios funciona correctamente. Cuando estoy en producción, sé exactamente las URL de todos mis servicios y puedo referirme a cada servicio por su nombre de dominio. Pero cuando es hora de depurar esto puede ser una pesadilla porque no hay ninguna opción para enlazar un servicio en la nube a una dirección IP específica (y puerto) y DevFabric no puede garantizar que un servicio en particular mantenga la misma dirección entre dos depuraciones diferentes sesión.

que han resuelto el problema con una técnica sencilla:

En mis WebRoles que se refieren siempre a nombre de dominio como debug.myservice.com o debug.myotherservice.com.

la dirección IP local se resuelve mediante el anfitriones archivo se puede encontrar en:

windows/system32/drivers/etc/hosts 

por anexar algunas declaraciones simples como, por ejemplo:

127.0.0.1 debug.myservice.com 
127.0.0.2 debug.myotherservice.com 

Esto soluciona el problema, pero puede ser extremadamente aburrido porque necesita actualizar manualmente el archivo hosts cada vez que inicia una nueva sesión de depuración.

Pero hay una solución simple y poderosa. Usted sabe que puede configurar un simple script de arranque que se ejecuta cada vez que se inicializa el servicio en la nube, se pueden encontrar más detalles aquí:

http://msdn.microsoft.com/en-us/library/windowsazure/hh180155.aspx

También puede ejecutar guión diferente cuando se está ejecutando en la nube o en el emulador

Lo que hago es ejecutar un script que actualice automáticamente el archivo hosts cada vez que mi servicio en la nube se inicialice en el entorno del emulador (y solo en el emulador).

Aquí el guión:

IF "%ComputeEmulatorRunning%" == "true" (
    cd Startup 
    UpdateDnsHostsOnDebugEnv.exe MyCompany.MyService.Site.WebRole debug.myservice.com 
    cd.. 
) 

y aquí lo que hay que añadir a ServiceDefinition.csdef con el fin de ejecutar el script en el arranque:

<Startup> 
    <Task commandLine="Startup\UpdateDnsHosts.cmd" executionContext="elevated" taskType="foreground"> 
     <Environment> 
      <Variable name="ComputeEmulatorRunning"> 
       <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> 
      </Variable> 
     </Environment> 
    </Task> 
</Startup> 

Aviso el uso de la UpdateDnsHostsOnDebugEnv.exe programa. Esta es una aplicación de consola simple que escribí que simplemente ejecuta csrun.exe y analiza el resultado para extraer la dirección de punto final local de la función y actualizar el archivo hosts.

Espero que te ayudemos.

+0

Hey @ lorenzo-melato - ¿podría decirme algo más sobre cómo lo hizo? Mi pregunta sobre esto es: http://stackoverflow.com/questions/20493043/how-to-map-ip-to-hostname-when-debugging-azure-cloud-projects – mbaaz

+0

Hola @mbaaz. Perdón, ahora veo tu comentario ... ¿Qué es lo que no está claro para ti? –

+0

Gracias por su respuesta @ lorenzo-melato. Mi interés sería cómo escribió su UpdateDnsHostsOnDebugEnv.exe, es decir. cómo usaría csrun.exe para obtener la información necesaria del proyecto que se está depurando. Parece que no puedo entender eso ahora. – mbaaz

Cuestiones relacionadas