ATopeCode
Blog sobre Desarrollo de Software

domingo, 26 de julio de 2015

Publicar Servicio Web ... toda una aventura.

Durante las últimas semanas he estado desarrollando un Servicio Web con WebAPI para posteriormente consumirlo en una App Móvil. Una vez finalizado y después de testearlo a fondo decidí publicarlo en mi Servidor Web IIS 8 local. Hasta ahí ningún problema, funcionaba perfectamente igual que desde el servidor que crea Visual Studio cuando ejecutamos nuestro proyecto. Decir también de paso que para poder publicar el servicio web, nuestra versión de Visual Studio no puede ser ni Express ni Community, porque estas versiones solo nos dejan publicar en Azure.


Trust Level:

El siguiente paso es publicarlo en internet, para poder acceder al servicio desde cualquier sitio. Tengo contratado un host 'compartido' en el cual suelo publicar Sitios Web, pero nunca había probado a publicar un Servicio Web. Mi primer chasco fué comprobar como el servicio era accesible pero cuando intentaba acceder a algún método (acción) me devolvía un error de seguridad.

Security Exception
Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file. Exception Details: System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.


Después de buscar información sobre el error y ver de que podía ser, resulta que en servidores compartidos el 'Trust Level' (nivel de confianza) de cada host está puesto en 'Medium' y sin posiblidad de modificarlo por parte del desarrollador.

El 'trust level' viene a indicar una serie de prohibiciones al sitio web para evitar problemas de seguridad. Como en un servidor compartido, mis sitios web comparten espacio con los del resto de clientes de ese servidor, el Administrador de Sistemas se asegura de que no haya problemas. En nuestro servidor web IIS local por defecto el 'trust level' está configurado con un valor 'Full', es decir, no existe ninguna restricción para nuestros sitios web, ya que se supone que solo publicamos nosotros en ese servidor. Pues resulta que en Servicios Web, como utilizamos Reflexión para serializar y deserializar los datos entrantes y salientes, para un Trust Level con valor Medium nuestro Servicio no se ejecutará y se lanzará una Excepción de Seguridad.

Me puse en contacto con el servicio técnico de la compañía donde tengo contratado el host para ver si existía la posiblidad de aumentar el 'trust level' pero me contestaron que la única opción sería contratar un host 'dedicado', ya que en 'compartido' por motivos de seguridad no se sube el trust level.


Probando en Amazon:

Después de buscar durante un buen rato le eché el ojo a los servicios en la nube de Amazon. En Amazon puedes montar un servidor virtual (máquina virtual) y no pagar nada durante el primer año. Menudo chollo no? Lo que acabas teniendo es una máquina virtual Linux o Windows ejecutándose en los servidores de Amazon y con una ip pública fija, o sea, tu propio PC en la nube que hará la función de servidor dedicado. Pues nada, manos a la obra! De todas las máquinas virtuales solo nos dejan escoger 1 que tendrá 30 GB de disco duro y 1 GB de memoria RAM, para ser gratis no está nada mal. En mi caso para Sistema Operativo escogí un Windows Server 2012.
Aquí os dejo una recopilación de enlaces con toda la información necesaria para montar la máquina virtual en Amazon:

Amazon Cloud Computing

Después de tener todo listo te puedes conectar a la máquina virtual por ssh o escritorio remoto. Una vez dentro hay que configurar todo el sistema operativo, en el caso de Windows Server 2012 hay un asistente bastante bueno para ir instalando todo lo que vamos a necesitar. Yo me centré más que nada en lo que conozco y necesito, que era el IIS y .NET.

Vale, hasta aquí parece que todo iba bien, entonces me dispuse instalar un Sql Server Express en la máquina virtual. Como el navegador está 'capado' por seguridad (se puede quitar la seguridad pero no es aconsejable) copié los archivos desde mi PC a la máquina virtual simplemente pegándolos en la ventana del escritorio remoto. Después de esperar un buen rato, cuando voy a instalar el Sql Server en la máquina cloud, resulta que no tengo espacio en disco duro!
Vaya hombre... resulta que con un disco duro de 30 GB, descontando el espacio que ocupa el sistema operativo y los archivos de instalación del Sql Server Express solo que me quedaban 2 GB libres en disco... a cambiar de servidor otra vez XD


Nos quedamos con Azure:

Bueno, decidí echarle un ojo a los precios en Azure y descubrí varias cosas interesantes. Azure tiene fama de ser caro, pero comparándolo con Amazon he llegado a las siguientes conclusiones:

-En Amazon te cobran el tiempo que tienes encendida la máquina virtual por hora y en Azure por minuto.
-En Amazon tienes 1 año gratis (escogiendo la máquina virtual con menos prestaciones), en Azure tienes 150 euros para gastar como quieras durante el primer mes.
-En Amazon el S.O. se instala en el espacio de disco que contratas, en Azure no, sorpresa! en Azure se instala el S.O. en una partición de 130 GB aproximadamente y el espacio que contratas está en otra partición.

Por lo tanto me fuí de cabeza a Azure ya que el primer mes es gratis (no voy a llegar los 150 euros ni de coña) y después del primer mes, puedes tener por unos 15 euros al mes una máquina virtual con 0.75 GB de RAM y 20 GB de disco duro (a parte de los 130 de la partición del S.O.)
Hay que decir que los 20 GB a parte son de almacenamiento temporal, no se nos aconseja almacenar información importante porque se puede perder si se apaga la máquina virtual. Pero en la partición del S.O. después de su instalación quedan unos 100 GB libres y este disco si que mantiene la información después de apagar la máquina virtual.
Para utilizar más espacio de disco se pueden contratar discos virtuales y se conectan a la máquina virtual.
Aquí os dejo una recopilación de enlaces con toda la información necesaria para montar la máquina virtual en Azure y la configuración del Windows Server 2012 R2:

Azure Cloud Computing

Otro problemilla que puede surgir, si queremos instalar un servidor de B.D. como el Sql Server Express es que al instalarlo en el Windows Server de la máquina virtual, si el Windows Server está en Inglés solo nos deja instalar la versión en Inglés del Sql Server. Yo por lo menos no encontré forma de cambiarle el idioma al Windows Server.

Al final acabé quitándole la seguridad al Explorer de la máquina virtual para descargarme el Sql Server Express (en inglés) desde la máquina virtual porque ahorra mucho tiempo (pero luego es aconsejable dejar la seguridad puesta), aquí se explica como:
Setting up an Azure Virtual Machine For Developers with Visual Studio 2013 Ultimate and SQL Server 2012 Express

Otra opción en vez de instalar el Sql Server es contratar una instancia (máquina virtual) Sql Server en Azure y crear un red virtual (VPN) entre ambas máquinas para tenerlas comunicadas.
Al tener el servidor de B.D. en una máquina virtual separada siempre podemos subir las prestaciones de dicha máqina para aprovechar las opciones de escalado que nos da Azure. Pero eso ya es para cosas mas serias y caras.



Pues nada, aquí queda reflejada mi pequeña aventura por si sirve de ayuda a alguien. Nos vemos.

No hay comentarios:

Publicar un comentario