Últimamente me ha tocado desarrollar aplicaciones que tengan una capa intermedia para transferencia de datos entre una aplicación y otra. El dilema estaba en decidirse por la arquitectura de este componente si debería ser un servicio Web en ASP.NET o una aplicación orientada a servicios WCF (Windows Communication Foundation).
Introducción
En este post intentaré explicar la diferencia entre los Servicios Web de ASP.NET y programar servicios WCF como servicios web de ASP.NET. Intentaré además explicar como se usa ambas tecnologías para el desarrollo de Servicios Web.
El desarrollo de servicios Web con ASP.NET se basa en la definición de los datos, serializa y deserializa objetos en documentos XML. Esto gracias a la clase XmlSerializer que permite controlar el modo en que se codifican los objetos en XML para transformar los datos desde o hacia un servicio.
Las cuestiones clave con XmlSerializer en .NET para serializar XML son:
-
Sólo los campos públicos o propiedades de. NET se puede traducir en XML.
-
Sólo las clases que implementan la interfaz IEnumerable.
-
Las clases que implementan la interfaz IDictionary, tal como HashTable no se puede serializar.
WCF (Windows Communication Foundation) utiliza las propiedades DataContractAttribute y DataMemeberAttribute para traducir los tipos del Framework en XML.
[DataContract] public class Producto { [DataMember] public string IDProducto; [DataMember] public decimal Cantidad; [DataMember] public decimal Precio; }
La propiedad DataContractAttribute se puede aplicar a una clase o una estructura, y DataMemberAttribute se puede aplicar a un campo o propiedad. Estas propiedades pueden ser públicas o privadas.
Diferencias importantes entre DataContractSerializer y XmlSerializer:
-
Uno de los beneficios prácticos en usar DataContractSerializer es que tiene un mejor rendimiento frente a XMLserialization.
-
XMLSerialization no indica que campos o propiedades de la clase o tipo se van a serializar en XML mientras que DataCotratSerializer si lo indica explícitamente.
-
El DataContractSerializer puede traducir la HashTable en XML.
Desarrollando el Servicio
Para desarrollar un servicio Web con ASP.NET hay que añadir el atributo WebService a la clase y WebMethodAttribute a cualquiera de los métodos de la clase:
[WebService] public class Service : System.Web.Services.WebService { [WebMethod] public string Test(string strMsg) { return strMsg; } }
Para desarrollar un servicio WCF sería de la siguiente forma:
[ServiceContract] public interface ITest { [OperationContract] string ShowMessage(string strMsg); } public class Service : ITest { public string ShowMessage(string strMsg) { return strMsg; } }
ServiceContractAttribute especifica que una interfaz define un contrato del servicio, el atributo OperationContract indica cuál de los métodos de la interfaz define las operaciones del contrato de servicio.
Una clase que implementa el contrato de servicio se conoce como un tipo de servicio en WCF.
Alojando el Servicio
Los servicios Web de ASP.NET se compilan en un ensamblado de biblioteca de clases (dll) y un archivo de servicio, con una extensión. Asmx que contiene el código para el servicio. El archivo de servicio se copia en la raíz de la aplicación ASP.NET y el ensamblado se copiará en el directorio BIN. La aplicación es accesible a través de la URL del archivo de servicio.
Los servicio WCF se pueden alojar en IIS o WindowsActivationService. Para ello se debe:
-
Compilar el servicio en una biblioteca de clases.
-
Copiar el archivo de servicio con una extensión. SVC en un directorio virtual y el ensamblado en el directorio BIN directorio virtual.
-
Copiar el archivo web.config en el directorio virtual.
Desarrollando la aplicación Cliente
- Los clientes de los servicios Web ASP.NET se generan mediante la herramienta WSDL.exe de línea de comandos.
- WCF utiliza la herramienta ServiceMetadata (Svcutil.exe) para generar el cliente para el servicio.
Representación del mensaje
- El encabezado del mensaje SOAP se pueden personalizar en los servicios Web ASP.NET.
- WCF proporciona los atributos MessageContractAttribute , MessageHeaderAttribute y MessageBodyMemberAttribute para describir la estructura del mensaje SOAP.
Descripción del servicio
-
La petición HTTP GET al servicio, hace que ASP.NET genere un WSDL (lenguaje de descripción de servicios Web) para describir el servicio y se retorna el WSDL como respuesta a la solicitud.
-
El WSDL generado se puede personalizar mediante la derivación de la clase de ServiceDescriptionFormatExtension.
-
Al hacer una petición al archivo. Svc, WCF genera el WSDL. El WSDL generado se puede personalizar mediante el uso de la clase ServiceMetadataBehavior.
Manejo de excepciones
-
En los servicios Web de ASP.NET, las excepciones no controladas se devuelven al cliente como errores de SOAP.
-
En los servicios WCF, las excepciones no controladas no son devueltos a los clientes como los errores de SOAP. Se proporciona un valor de configuración para que las excepciones no controladas se devuelvan a los clientes con el propósito de ser capturados y depurados.
A priori podemos notar que los servicios WCF tienen más ventajas frente a los servicios Web de ASP.NET. Para reforzar esto, a continuación puntualizo las características más importantes:
-
WCF soporta más estándares de WS-* que los propios de los servicios web.
-
WCF admite varios enlaces HTTP, TCP, MSMQ, WS-HTTP, etc. Mientras que los servicios web sólo son compatible con HTTP.
-
WCF puede mantener transacciones como COM+.
-
Tienen integración con JSON.
-
Pueden alojarse en IIS, WAS, servicios Windows o estar auto alojados.
-
Los servicios Web no tienen administración de instancias, por ejemplo no se puede tener un servicio Web con patrón Singleton o un servicio Web completo con control de sesiones.
muy buen articulo me libra de muchas dudas, talves puedas exponer algunos links con mas informacion de wcf
hola muchas gracias por la informacion, pero me queda una duda ya viendo de frente webservices vs wcf cual es mejor, o en que casos es mejor usar uno o otro
Definitivamente piensa en lo siguiente, si construyes un Webservice tradicional, pues siempre será solo eso. Pero si construyes un servicio de tipo WCF tendrán no solo la posibilidad de usarlo como Webservice sino que adicionalmente podrás exponerlo como un componente para diversos usos, dentro de un servidor Web o sin él, además de usar especificaciones para seguridad como WSE.