Varios servicios hospedados dentro de un mismo Hosted Service de Windows Azure – Full IIS

Hace unos cuantos días, lo siento por el retraso :(, uno de mis followers me preguntó si era posible tener un sitio web y un web service en una misma máquina virtual de Windows Azure. Lo cierto es que si 🙂 Desde que tenemos control total sobre IIS somos capaces de crear tanto sitios, directorios virtuales como aplicaciones virtuales que cuelguen desde el IIS de la máquina virtual de Windows Azure Compute.
Para este post, tengo una pequeña demo donde muestro cómo es posible crear directorios y aplicaciones virtuales dentro de un Web Role. La estructura sería la siguiente:

Como se puede ver en la imagen anterior tenemos dos proyectos: un web role, dentro de este una carpeta llamada statichtml y un proyecto de WCF que será mi servicio web. Por otro lado, en el proyecto de Windows Azure observamos que únicamente tenemos un sólo rol dado de alta. Para poder hacer esta “mezcla” debemos centrarnos en el archivo ServiceDefinition.csdef

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="WebRole_WebService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="aspnetWebRole" vmsize="Small">
    <Sites>
      <Site name="Web">
        <VirtualApplication name="myWebService" physicalDirectory="..WcfService">
        </VirtualApplication>
        <VirtualDirectory name="myStaticHtml" physicalDirectory="..aspnetWebRolestatichtml">
        </VirtualDirectory>
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
  </WebRole>
</ServiceDefinition>

Por decirlo de alguna manera, tenemos un proyecto máster dentro de nuestra solución: aspnetWebRole. Dentro de la configuración del mismo, tenemos un apartado llamado Sites donde podemos añadir tanto sitios nuevos, como directorios virtuales y aplicaciones virtuales.
Para poder definir qué es cada cosa tenemos una serie de tags organizados de forma jerárquica donde definimos qué directorios y qué aplicaciones virtuales pertenecen a qué sitio.

Nota: el atributo physicalDirectory es relativo al archivo ServiceDefinition.csdef. De todos modos, si no nos queda claro cómo montar el path, al intentar publicar el sitio en el apartado Errors de nuestro Visual Studio 2010 nos mostrará la ruta en la cual está intentando buscar.

Si ejecutamos este código a través del emulador y accedemos a nuestro IIS en local, podremos observar que hemos conseguido la siguiente estructura dentro de nuestro servidor web:

Adjunto el proyecto por si fuera de utilidad 😀

¡Saludos!