Programación y Estrategias de Negocios RSS 2.0
# Monday, July 14, 2008

Acabo de trasladar el sitio www.juanpelaez.com y otros sitios asociados a un nuevo proveedor de hosting, estuve un par de años con el anterior proveedor pero de repente decidieron migrar sus servidores de correo a un servidor Linux (sin notificar a los usuarios), como resultado de la migración estuve desde el 29 de junio hasta el 9 de Julio sin correo, llame en varias ocasiones a Servicio al Cliente, pero nunca pude obtener una solución, así que solo me quedo cambiarme de proveedor, curiosamente el proceso de retirarme del servicio si fue muy rápido, sin embargo no pareció importarle a nadie las razones por las que me estaba cambiando (nadie me pregunto nada).

Hosting

Pues bien me cambie a mosso (the hosting Cloud) un nuevo concepto de hosting realmente novedoso, no preguntan por servidores dedicados, compartidos, virtual servers ni nada de eso, es puro software como servicio (SaaS) o incluso servicios como servicios. (SsaaSs), así que me inscribo en el sistema, me crean una consola de gestión de mis sitios en 5 minutos y estoy listo para empezar a distribuir servicios de hosting:

 

 

· Puedo crear mis clientes

· Luego puedo crear uno o muchos sitios para cada cliente, incluidas cuentas de correo ilimitadas.

· Puedo establecer si a este cliente se le va a facturar (debería!) y el sistema genera las facturas por mí para que yo se las envíe a mis clientes.

· Puedo establecer si los sitios de mis clientes son en Windows (IIS7,.Net 3.5) o Php, Linux, incluso RubyonRails.

· Tengo buenos reportes de uso, de facturación, etc.

· Tengo un buen servicio de soporte por Mail, LiveChat y Telefono, 7x24.

· Todo esto desde la consola Web de administración del sistema.

· tengo 500GB de ancho de banda, 50GB de espacio en Disco y 3 Millones de peticiones web por Mes.

 

 

Si la anterior lista no le impresiona piense en esto, antes tenía un servidor Windows, si alguna vez quería montar una aplicación de pruebas en Linux con Apache, necesitaba otro servidor de hosting, así que estaba realmente limitado a lo que estaba pagando: Un servidor Windows. Ahora no importa si alguna vez necesito un website en Apache Php o en Ruby on Rails simplemente lo tengo, es un cambio de paradigma importante en vez de preguntarme por hardware o Sistemas operativos me preguntan por la necesidad que tengo: Sitios Web.

 

 

Yo mismo migre los apuntadores de los DNS desde mi antiguo proveedor al nuevo, empecé el proceso de registro en este nuevo proveedor a las 3 de la tarde y a las 5pm ya tenía mi correo nuevamente arriba. Apenas termine de cargar los archivos me conecte con el servicio al cliente (10pm) y rápidamente configure mis aplicaciones (básicamente un blog de DASBlog), la gente parecía saber de su tema. Así que en menos de 12 horas ya tenía desde cero mis sitios corriendo en un nuevo servidor.  En teoría solo pago lo que consumo (con un mínimo de 100 dólares) pero parece un buen trato.

Por cierto este servicio es un emprendimiento nuevo de RackSpace que es la compañía mejor clasificada para servicios de hosting de acuerdo con las revisiones de webHost Magazine

Software as a Service

Este es un tema interesante (mas allá de mi cambio de dominio) por que se habla mucho de computación en la nube (Cloud Computing)  y hay muchos rumores y realidades que van desde alquiler de Exchange y SharePoint por parte de Microsoft hasta inversiones gigantes de Microsoft en infraestructura (3 datacenters nuevos en USA, el de Chicago el más grande de USA, etc) hasta nuevo servicios de publicación de aplicaciones corporativas en Internet que serán anunciados en las próximas conferencias de Desarrolladores. Así que empezar a ver este tipo de servicios es realmente un aviso de cómo será el futuro de internet y de la computación.

 

 

En el software as a Service (SaaS) un tema muy importante es el aprovisionamiento (Provisioning) del servicio, es un concepto interesante porque un servicio NECESITA ser escalable y eso solo es posible con sistemas automáticos, por ejemplo en este servicio de hosting todo pasa sin intervención de humanos, creo los sitios, creo las cuentas, facturo, etc., el sistema de aprovisionamiento es clave para el éxito del software que será rentado.  

 

 

Y claro ahora que tengo otras preocupaciones como el espacio que uso y demás empiezo a replantearme la forma como estoy usando otros servicios de la Nube, por ejemplo: a partir de ahora todas las fotos las publicare en flickr.com y solo colocares los apuntadores en mis posts, de pronto es un poco más de trabajo desde Windows Live Writer al momento de publicar, pero seguro vale la pena. Todos los archivos los estoy publicando en skydrive.live.com y todos los videos los voy a poner en Silverlight streaming, de esta forma ahorro montones en ancho de banda, y espacio.

Y claro el toque final es poner todos mis RSS a apuntar a través de feedBurner, para que los que se suscriban al blog no gasten mi precioso ancho de banda.

 

 

Juan Carlos Peláez
Arquitecto de Software

Keywords: Software as a Service, Cloud Computing, Hosting, Juan Peláez, Juan Carlos Peláez, Windows Live Services, Blog, DasBlog.

Monday, July 14, 2008 7:53:00 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
Arquitectura | Blog | Gestion de Empresas de Software | IIS7 | SilverLigth | Software as a Service | Windows Live
# Friday, May 16, 2008

Desde hace algunos meses vengo participando en un Proyecto Grande para Dunkin Donuts en Estados Unidos, básicamente la construcción del sitio www.DunkinDonuts.com y otros sitios afiliados como www.myicedcoffee.com, estos sitios utilizan diferentes tecnologías como Flash, JavaScript, WebServices, Certificados Digitales, y otra lista de cosas que son interesantes de poner a trabajar juntas y que son probadas en todos los sistemas operativos y navegadores populares.

 

Estos sitios esperan tener cantidades masivas de visitantes todo el tiempo con picos muy altos en ciertas campanas publicitarias y días especiales, así que hay que enfrentar el problema de la alta disponibilidad en serio, y si se le agrega que se usan muchas películas de flash (corriendo contra servicios web) algunas de ellas muy pesadas, entonces se tiene una combinación un poco complicada.

 

En este sitio se han implementado diferentes soluciones como un cluster de BD, un Cluster de servidores de presentación, cada servidor con 4 Gigas de RAM y sistemas redundantes de acceso a datos, etc, incluso tarjetas de red dedicadas para la comunicaciones entre las maquinas, la salida a internet e incluso la que me permite conectarme para tareas de administración.

 

Sin embargo, una de las tecnologías más interesantes que hemos empleado tiene que ver con la Red de Distribución de Contenido (CDN por Content Distribution Network) que se ha implementado, aquí algunas líneas al respecto. (No es la única, muchas decisiones de arquitectura de la aplicación, de infraestructura y de negocios deben tomarse e implementarse correctamente para que un sitio realmente soporte un tráfico fuerte, empezando por tener una idea de cuánto trafico se estima tener).

 

Que es una CDN?

 

Una red de distribución de contenido es un montón de infraestructura generalmente distribuida por todo el mundo (al menos puntos claves para internet) que guardan copias locales de ciertos tipos de archivos para entregue a los usuarios que los solicitan usando ventajas geográficas (están más cerca). (Usted de verdad no creía que youtube tenía los discos duros más grandes del mundo o sí?). De esta forma cuando un usuario solicita (a través del browser) un video, canción, imagen, o incluso una de las películas de flash, esta le es enviada desde el servidor que se encuentra más cerca. Más referencias e información en ingles aquí

Como toda esa infraestructura es arrendada se obtienen importantes beneficios en costos de hardware y uso del ancho de banda de su proveedor de hosting, y para los usuarios la experiencia es muy buena porque siente que su sitio es mucho más rápido de lo que en realidad es.

 

Como se usa?

 

Una de las cosas realmente increíbles de esto es la forma como funciona desde la perspectiva del desarrollador (es decir la mía) (la otra cosa increíble es como selecciona quien en realidad está cerca, pero ese es otro tema), para mi es transparente la localización del archivo, es decir no me importa.

 

Por ejemplo:

Supongamos que tengo unas imágenes muy grandes que quiero que se suban a esta red CDN, en mi estructura de archivos están en una carpeta images y yo las referencio como src=”images/imagengrande1.jpg” bueno, al afiliarse a la red de distribución de contenido ellos le van a crear un apuntador para su dominio del tipo assets.midominio.com, así que ahora en vez de apuntar el scr de la imagen como antes usted pone scr=http://assets.midominio.com/images/imagengrade.jpg, la magia ocurre cuando al hacer la solicitud un usuario por primera vez, la CDN busca en su propia lista de archivos, como no la encuentra va hasta su servidor y se la manda al usuario, pero al mismo tiempo saca una copia y la almacenan en sus propios servidores, es decir que entre más personas visiten el sitio de diferentes partes del mundo o del país, mas rápido funciona al sacar copias del contenido al momento de distribuirlo.

 

Es decir, usted no sube nada a la red, ella sola se alimenta a medida que sus usuarios piden los archivos, y no hay problemas de crosssite scripting por que los archivos si están en su dominio, solo que en otras maquinas.

 

Esto genera dos problemas, ambos fáciles de solucionar y que bueno, por el beneficio puedo vivir con ellos.

 

1. Obviamente si hay un cambio en el archivo que está cargado en la red, de alguna forma hay que notificarlo para que se actualice el archivo, sino la red de CDN va a seguir enviando el archivo desactualizado. Sin embargo todas estas redes tienen una consola de administración donde usted puede ver reportes de uso, pero también puede solicitar que un archivo sea actualizado, es un proceso automatizado generalmente basado en colas pero que dependiendo del trafico del sitio puede tomar desde minutos hasta horas, así que procure evitar los cambios.

 

2. Como en el proceso de desarrollo muchas veces hay que cambiar cosas (no debería ser, pero así es), es mejor tener alguna forma de “prender y apagar” el servicio, asi que una buen opción es poner en el archivo de configuración la ruta que se va a usar o en el load del control o en una función de JS o en CSS donde se pueda hacer el cambio en un solo sitio y afecte todos los archivos que se están cambiando.

 

Para tener una?

 

Los proveedores de este servicio son Akamai, LimeLight Network (ya que estoy usando) (por cierto que Akamai demando a LimeLight por 45 millones de dólares, según ellos Limelight violo la licencia concedida por MIT para usar la tecnología que permite hacer la reconstrucción de los URL de los archivos que se usan en la CDN), así que solo hay que ir y suscribirse, pagar el servicio mensual y listo hay diversos servicios incluido el de tener televisión de HD por internet hospedada en la red.

 

Espero que esto le ayude a salvar algunas horas y a construir sitios de altísima disponibilidad.

 

Juan Carlos Peláez

Arquitecto de Software

 

Keywords: Arquitectura, CDN, Content delivery Network, Content Distribution Network,

Friday, May 16, 2008 3:38:38 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
Arquitectura | Articulos de Desarrollo
# Tuesday, August 21, 2007

Este post es una continuación del anterior sobre FastCGI y el IIS7, en Windows 2008 Beta 3 y Windows Vista, se incluye como soporte nativo FastCGI, lo que permite correr en maquinas Windows aplicaciones PHP y otros lenguajes de Script con altísimo rendimiento y estabilidad, incluso en ambientes en producción. El FastCGI CTP preview 2 también pueden montarse sobre IIS 5.1 y 6.0.

En este post, más allá de las instrucciones de cómo instalar una aplicación PHP en Windows Vista o Windows 2008, hablaré un poco de las razones por las que el rendimiento de las aplicaciones se incrementa al usar FastCGI.

Primero un poco de Antecedentes.

Common Gateway Interface (CGI)

El estándar de facto para aplicaciones en servidores web es CGI, que fue implementado inicialmente por el servidor NCSA. CGI tiene varios beneficios:

· Simplicidad. es fácil de entender

· Independencia del Lenguaje. Las aplicaciones CGI pueden ser escritas en cualquier lenguaje

· Independencia de Procesos. Ya que las aplicaciones corren en procesos separados, las aplicaciones con problemas no pueden dañar el servidor web o acceder al estado interno y privado del servidor.

· Estándar Abierto. Alguna forma de CGI ha sido implementada en todos los servidores web

· Independencia Arquitectónica. CGI no está atado a ninguna arquitectura particular de servidor 

CGI también tiene algunas deficiencias importantes. El problema principal es el rendimiento: debido a que se crea un nuevo proceso para cada request y este se elimina cuando el request se completa, la eficiencia es pobre.

CGI también tiene una funcionalidad limitada: solo soporta el Rol "responder", donde la aplicación genera la respuesta que es enviada al cliente, los programas CGI no pueden asociarse a otras partes del procesamiento del request como autorización o registro de errores.

 

APIs de Servidor

En respuesta a los problemas de rendimiento de CGI, diferentes compañías han desarrollado APIS para sus servidores. Los dos más relevantes son NSAPI de Netscape e ISAPI de Microsoft. El servidor Apache también tiene un API.

Las aplicaciones asociadas al API del servidor pueden correr mucho más rápido que los programas CGI. El problema del Inicio / iniciación se ha mejorado, ya que la aplicación corre en un proceso dedicado de servidor y se persiste entre las solicitudes. Las API del servidor Web, ofrecen mucha más funcionalidad que CGI, cada persona puede escribir extensiones que realizan control de accesos, acceder a los archivos de registro del servidor, y pueden conectarse en otras etapas del procesamiento del request. 

 

Entonces que es  FastCGI?

La interface FastCGI combina los mejores aspectos de CGI y las APIs propietarias. Como CGI, las aplicaciones FastCGI corren en procesos separados e independientes. Las ventajas de FastCGI's incluyen:

· Rendimiento. Los procesos FastCGI son persistentes –se re usan en manejar múltiples solicitudes. – Esto resuelve los problemas de rendimiento de CGI de crear nuevos procesos para cada request.

· Simplicidad, fácil migración desde CGI. La librería de aplicación FastCGI simplifica la migración de las aplicaciones CGI existentes. Las aplicaciones construidas con FastCGI pueden correr programas CGI para compatibilidad con Web Servers antiguos.

· Independencia de Language. Como CGI, las aplicaciones FastCGI pueden ser escritas en cualquier lenguaje.

· Independencia de Procesos. Una aplicación FastCGI con errores no puede corromper el core del servidor web o alguna otra aplicación. Una aplicación FastCGI no puede robar ningún secreto (como las llaves de sesión para encripción) del servidor Web.

· No-propietario. FastCGI es soportado por todo los productos del Open Source del Mercado, incluyendo apache, NCSA y ahora es soportado por servidores comerciales de Microsoft y Netscape.

· Independencia Arquitectónica. La interface FastCGI no está atada a ninguna arquitectura particular de servidor. Cualquier servidor puede implementar la interface FastCGI. De igual manera, FastCGI no impone ninguna arquitectura a la aplicación: las aplicaciones pueden ser single o multi-threaded, sin importar la arquitectura de hilos del servidor web.

· Soporte para computación distribuida. FastCGI prove soporte para correr aplicaciones remotamente, lo cual es útil para distribuciones de carga y manejo externo de web sites.

 

La interface FastCGI

La funcionalidad que provee la interface FastCGI es muy similar a la que provee CGI. Para entender mejor el protocolo FastCGI. El procesamiento de peticiones CGI es así:

1. Para cada Request, el servidor crea un nuevo proceso y el proceso se inicializa por sí mismo.

2. El servidor web pasa la información del request( como host remoto, nombre de usuario, encabezados HTTP, etc) a las variables  de entorno del programa CGI.

3. El web server envía cualquier input del cliente  (como valores entrados por el usuario en un formulario HTML) al estándar input del programa CGI.

4. El programa CGI escribe cualquier output para que sea retornado al cliente como salida estándar. La información de error es escrita por el web server.

5. Cuando el proceso CGI se cierra, la solicitud queda completa.

FastCGI es conceptualmente muy similar a CGI, con dos diferencias principales:

· Los procesos FastCGI son persistentes: después de finalizar una solicitud, los procesos quedan en espera en vez de finalizar. 

· En vez de usar variables de ambiente del sistema operativo y pipes,  el protocolo  FastCGI multiplexa la información del ambiente, el input  estándar, el output estándar y error sobre una conexión full-duplex. Esto permite a los programas FastCGI correr en maquinas remotas, usando conexiones TCP entre el servidor web y las aplicaciones FastCGI.

El procesamiento de una solicitud en una aplicación single-threaded FastCGI ocurre así :

1. El Web server crea la aplicación FastCGI para manejar las solicitudes al servidor. El proceso puede ser creado en el inicio o creado por demanda.

2. El programa FastCGI seinicializa  por sí mismo, y espera una nueva conexión con el web server.

3. Cuando llega una solicitud de un cliente, el servidor  web abre una conexión a los procesos FastCGI. El servidor envía la información de ambiente y el input estándar sobre la conexión.

4. el proceso FastCGI envía la salida estándar y la información de errores de regreso al servidor sobre la misma conexión. 

5. Cuando el proceso  FastCGI cierra la conexión, la solicitud se completa. El proceso FastCGI queda a la espera de otra conexión desde el servidor web.

Las FastCGI pueden correr localmente  (en la misma máquina que el web server) o remotamente. Para aplicaciones locales, el servidor usa un  full-duplex pipe para conectarse con el proceso de la aplicación  FastCGI . Para aplicaciones remotas, el servidor usa conexiones TCP.

Las aplicaciones FastCGI pueden ser  single-threaded or multi-threaded. para aplicaciones  single threaded, el servidor web mantiene un pool de procesos  (si la aplicación corre localmente) para manejar las solicitudes de los clientes. El tamaño del Pool es configurable por el usuario. Las aplicaciones FastCGI Multi-threaded pueden recibir múltiples conexiones del web server y manejarlas de forma simultánea en un solo proceso.  (De esta forma lenguajes, con soporte para multi thead, garballe collection, entre otros, lo hacen lenguajes naturales para implementar aplicaciones multithread usando FastCGI)

 

Roles de Aplicación.

Un problema importante con CGI es su funcionalidad limitada: los programas CGI solo proveen respuestas simples al request.  FastCGI provee funcionalidad ampliada con soporte para tres diferentes roles de aplicación: 

· Responder. este es el rol básico en  FastCGI y corresponde a la funcionalidad básica ofrecida por CGI hoy. 

· Filter. las aplicaciones FastCGI filtran los archivos solicitados al web server antes de que sean enviados al cliente. 

· Authorizer. El programa FastCGI realizan una decisión de control de acceso para el request ( por ejemplo realizando una búsqueda a la base de datos del tipo Usuario/password).

Otros roles serán definidos en el futuro. Por ejemplo,  un rol "logger" podría ser útil, donde el programa FastCGI podría recibir el registro del log del servidor para procesamiento y análisis en tiempo real. 

 

Que tan rápido es FastCGI?

La respuesta depende de la aplicación, algunas pruebas hechas en internet muestra lo siguiente:

En esta medición se usa un archivo, una solicitud CGI y una fastCGI, usando una aplicación que retorna un número fijo de bytes. 

Archivo  

21ms + 0.19ms per Kbyte

FastCGI

22ms + 0.28ms per Kbyte

CGI

59ms + 0.37ms per Kbyte

Con este dato podemos trata de calcular la velocidad después de migrar una aplicación típica CGI de base de datos a FastCGI, asumiendo que la aplicación toma 50ms para inicializar las conexiones a las bases de datos y genera 5k de datos. Los resultados finales pueden calcularse así: 

CGI

59ms + 50ms + (0.37ms)(5) = 111ms

FastCGI

22ms + (0.28ms)(5) = 23ms

En esta prueba, FastCGI tuvo una ventaja de rendimiento de 5x sobre CGI, más que nada debido a no tener que crear e iniciar un nuevo proceso para cada solicitud.

 

En resumen

FastCGI es un protocolo estándar que permite a ejecutables que usen Frameworks CGI interactuar con un Web Server.

La mayor diferencia con el Protocolo CGI Estándar es que FastCGI rehúsa los Procesos CGI para múltiples peticiones, lo que incrementa el rendimiento en comparación con CGI.

El soporte de IIS para FastCGI permite a IIS hospedar programas CGI normales como PHP, o Ruby On Rails, usando el protocolo FastCGI, ofreciendo alto rendimiento y estabilidad en ambientes de producción

Para usar el soporte  FastCGI en IIS se requieren tres elementos:

· El web server IIS (IIS5.1, IIS6, and IIS7).

· El componente FastCGI para IIS

· EL programa CGI que será hospedado.

Como funciona?

El servidor web despacha las solicitudes http que se han realizado a su aplicación usando el componente FastCGI, este a su vez lanza el programa ejecutable CGI y reenvía el request para que sea procesado. Una vez la solicitud se procesa y la respuesta se finaliza y es retornada al servidor y al cliente, el proceso CGI es usado para llamadas siguientes. Esto permite evita las penalidades de alto rendimiento de iniciar un nuevo proceso para cada solicitud, lo que resulta en mucho mejor rendimiento y escalabilidad en ambientes de producción.

El protocolo FastCGI es estándar si quiere tener más información sobre FastCGI puede ver más aquí. http://www.fastcgi.com/devkit/doc/fcgi-spec.html.

El paquete FastCGI es totalmente compatible con la distribución actual y oficial  PHP 5.x disponible para Windows desde  www.php.net/downloads. También puede usar el preview de Fast CGI con la instalación existente de  PHP 5.x (sin embargo usar la versión ThreadSafe incrementa el rendimiento hasta un 30%)

La versión 5.2.3 también contiene las mejoras desarrolladas por Zend para mejorar el rendimiento del motor de PHP sobre Windows.

Espero que sea de Ayuda

Juan Carlos Peláez

MCTS

Miembro del Microsoft Speaker Group Andino  

Miembro del Microsoft Influencers Group de Colombia.

Keywords: PHP, FastCGI, Windows Vista, Windows 2008, IIS7, Arquitectura.

Tuesday, August 21, 2007 9:20:38 AM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
Arquitectura | Articulos de Desarrollo | FastCGI | IIS7 | PHP | Windows Server 2008 | Windows Vista
# Friday, July 13, 2007
 
Durante el desarrollo de la nueva versión de nuestras aplicaciones usando arquitecturas distribuidas con WCF encontré los siguientes problemas en las herramientas de Visual Studio que quiero compartir aqui.
 
El primero, que muchos habran identificado, es que al generar el código usando la opción de nueva libreria de WCF en visual basic genera una clase datacontract1 que no tiene marcada ninguna de sus propiedades como datamember, por lo que cuando se publica el servicio y se genera el proxy esta clase no tiene ninguna propiedad publica que pueda trasmitirse con por el cable, esto se soluciona facilmente marcando como datamember la propiedad generada para que quede asi: (en negrillas lo que hay que adicionar)
 
<DataContract()> _
Public Class DataContract1
Private m_firstName As String
Private m_lastName As String
 
<DataMember()> _
Public Property FirstName() As String
Get
Return m_firstName
End Get
Set(ByVal value As String)
m_firstName = value
End Set
End Property
 
<DataMember()> _
Public Property LastName() As String
Get
Return m_lastName
End Get
Set(ByVal value As String)
m_lastName = value
End Set
End Property
End
Class
 
El segundo tiene que ver con el nombre por default para el namespace que coloca Visual Studio a los proyectos, este namespace genera un problema en la serialización de los objetos marcados como datacontract ya que estos llegan correctamente al servicio pero no estan inicializados, si se depura el cliente se ve correctamente creado el objeto pero en el servicio no estan los valores.
 
Este punto se puede resolver usando alguno de los siguientes procedimientos:
 
a. Eliminado el namespace colocado por default en el cliente, el host y el servicio. (usando las propiedades del proyecto dentro de visual studio).
b. al generar el proxy del servicio usando la herramienta svcutil.exe usar el modificar /n para indicar que se quiere generar un proxy con el namespace del cliente, algo como esto:
 
svcutil.exe *.wsdl *.xsd /namespace:*,MyNamespace /language:VB
 
siendo MyNamespace el nombre del namespace del cliente del servicio.
 
Estos problemas no se presentan cuando se usan servicios con tipos basicos del CRL como strings o enteros o en algun otro tipo de contracto (operacion,fault,etc), es unicamente para cuando tiene contratos de datos del tipo datacontract, tampoco se presentan en C#.
 
espero que sea de utilidad.
 
Juan Carlos Peláez
MCTS
 
KeyWords: WCF, svcutil, Visual Basic, Framework, net, Arquitectura, Componentes Distribuidos, Cliente, Servicio, Host, Microsoft
Friday, July 13, 2007 7:33:19 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
.net | Arquitectura | Articulos de Desarrollo | WCF | Web Services
# Tuesday, July 10, 2007

Aunque no sé si sea  un escenario muy común, (para nosotros en Gattaca si lo es), hay aplicaciones legacy escritas en ASP clásico que empiezan a integrarse con aplicaciones en .Net, bien sea como parte de un proceso paulatino de migración o como parte del proceso de agregar nuevas funcionalidades a la aplicación existente, en ambos escenarios una forma simple de integrar la aplicación asp con la nueva aplicación .net es exponer las nuevas funcionalidades de la aplicación .Net por medio de servicios web.

Aunque existe en La Red literatura respecto a la forma como debe hacerse esta invocación del web service desde la página web no todos los ejemplos apuntan a escenarios reales, el objetivo de este post es mostrar cómo debe realizarse esta integración para aplicaciones del mundo real.

1. El primer problema consisten en identificar cuáles son los tipos de datos que se van a transferir entre la aplicación asp y la aplicación .net, mi recomendación es pasar datos de tipos básicos del CRL, es decir, strings, longs, integers. Aunque es posible pasar objetos representados como XML para que después sean des-serializados por la aplicación .net esto complica bastante el escenario e incluye nuevos elementos de error. (Nosotros transferimos solo strings y creamos los objetos en la aplicación .net, para lo cual creamos los constructores adecuados)

2. El siguiente problema es identificar quien es el realmente el cliente del servicio, en la mayoría de los escenarios el cliente del servicio es código del lado del servidor, (el código que esta entre los tags <%%> es el código del servidor), también es posible que el cliente sea alguna de las funciones JavaScript de la página que se quiere invocar. (Este es el escenario que derivo en la existencia de AJAX Asynchronous JavaScript And XML).  Por ahora nos enfocaremos en el escenario donde el código del lado del servidor es quien consume el web service.

3. Ahora debemos seleccionar la forma como se comunicará la aplicación asp con el servicio web, básicamente hay dos opciones, usar SOAP, o usar el parser de xml (HTTP Post) que contiene un objeto poco conocido llamado MSXML2.ServerXMLHTTP que puede ayudarnos a realizar estas llamadas. Básicamente es un tema de gusto, facilidad y conveniencia, sin embargo como es necesario tener instalado el Toolkit de SOAP para poder usar los objetos de SOAP desde asp clásico y dicho componente se queda sin soporte a partir de Marzo 31  del 2008, entonces nosotros preferimos usar HTTP Post.

4. Bien lo siguiente es escribir el código del servicio web y modificar la página asp para que lo consuma, lo del servicio web no lo vamos a profundizar, es una clase con la decoración webservice con algunos métodos decorados webmethod, etc. un ejemplo sencillo puede ser algo como esto:

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel

<System.Web.Services.WebService(Namespace:="http://MyNameSpace/services/MyProduct> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class WorkFlowServices
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function ServiceTest() As String
        Return "En Ejecucion..."
    End Function

    <WebMethod()> _
    Public Function MyMetodoconParametros(ByVal Client As String, ByVal UserID As Long, ByVal IDProcessCase As Long, _
                                                ByVal Sequence As Long, ByVal EntryDataType As String, ByVal IDEntryData As String, ByVal EntryData As String) As Long

...hacer algo, retornar algo.

    End Function

End Class 

5. Ahora como consumir este web service desde la página asp clásica, es algo como esto:

<%

Dim xmlhttp

Dim DataToSend

Dim postUrl

postUrl = "http://IPMyServer/Services/WorkFlowServices.asmx/MyMetodoconParametros"

DataToSend="Client=Tester&UserID=1&IDProcessCase=80&Sequence=0" & _

"&EntryDataType=TestWebService&IDEntryData=0&EntryData=1"

 

Response.write postURL

Response.write "<br>"

 

Set xmlhttp = server.Createobject("MSXML2.ServerXMLHTTP")

xmlhttp.Open "POST",postUrl,false

xmlhttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded"

xmlhttp.send DataToSend

 

Response.Write(xmlhttp.responseText)

%>

Lo importante de este segmento de código, es la forma como se construye la invocación del método, la variable postURL tiene la dirección del servicio web asi como el nombre del método que se va a invocar. Luego la variable DataToSend tiene la información de los valores que toman los diferentes parametros que se van a pasar al metodo del web service (la recolección de estos parámetros depende del tipo de uso e interfaz que se tenga con los usuarios pero puede ser la recolección de una forma usando request.form o la recolección de los parámetros del QueryString que invocó la páginas ASP).  

Otra cosa importante es la definición del encabezado en la linea xmlhttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded" .

Listo, se invocó el web service, ahora el resultado puede recuperarse de una de estas propiedades: responseBody, responseStream, responseText, and responseXML., (nosotros usamos response.text que nos retorna todo el entity body como un stream)

Tips Súper Importantes:

· Cuando su cliente del servicio web sea el propio código asp ("del lado del servidor") se recomienda usar el objeto MSXML2.ServerXMLHTTP que ha sido diseñado y optimizado para comunicaciones entre servidores.

· El código anterior genera un error en la mayoría de los servicios web del framework 2.0, es un error del tipo "Request format is unrecognized for URL" o en español "Formato de solicitud no reconocido para la dirección URL" esto se debe a que los protocolos Get y Post estan deshabilitados por omisión (default) en las aplicaciones del framework 2.0 para todas las peticiones de orígenes diferentes a Localhost. (Esa es la razón por la que la página de prueba de los servicios web como se ve desde otra maquina no tiene el formulario Test Service), por lo tanto para que efectivamente se realice la invocación hay que habilitar estos protocoles, eso se hace incluyendo las siguientes líneas en el archivo web.config del servicio web de .net.

<system.web>

    <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>

(...)

</system.web>

En este articulo hay más información del comportamiento de los protocolos, aunque solo habla del framework 1.1. también ocurren con en el framework 2.0.

Espero que sea de utilidad

 

Juan Carlos Peláez
MCTS

Keywords: Web Services, ASP Clasic, .Net, Framework 2.0, VB, "Formato de Solicitud no reconocido",

Tuesday, July 10, 2007 1:12:34 PM (SA Pacific Standard Time, UTC-05:00)  #    Comments [0] - Trackback
.net | Arquitectura | Articulos de Desarrollo | WCF | Web Services
Contácteme
mail: jpelaez at juanpelaez.com
Archivo
<November 2008>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
FeedBurner
Maps
Locations of visitors to this page
Sponsors
Acerca de...

Aviso Legal
Las opiniones expresadas en este sitio representan el punto de vista de Juan Peláez sobre diferentes temas y no representan la posición de Studiocom.com.Inc, Microsoft. o de cualquier otra compañía que haya contratado los servicios de consultoría de Juan Peláez

© Copyright 2008
Juan Carlos Peláez
Sign In

Technorati Profile
Estadísticas
Total Posts: 69
This Year: 40
This Month: 2
This Week: 0
Comments: 10
All Content © 2008, Juan Carlos Peláez
El tema 'Business' para DasBlog fue creado por Christoph De Baene (delarou) y modificado para espa�ol por Juan Peláez
Powered by FeedBurner