En el diseño y desarrollo de servicios web podemos utilizar dos aproximaciones:
Dirigido por contrato, o Contract-First. Primero se describen las funcionalidades del servicio web en cuanto a su interfaz, semántica y aspectos administrativos de la invocación, siendo la especificación WSDL el estándar. El WSDL, como documento XML, puede ser parseado por una herramienta para facilitar la implementación del web service proveedor o consumidor.
Contract-Last, en el que primero se implementa el servicio web en un determinado lenguaje y posteriormente se genera un WSDL que lo describa.
Cada cual tiene sus ventajas e inconvenientes [1] [2] [3]. En este tutorial veremos la primera de las dos opciones, implementando en C# un servicio web proveedor. Utilizaremos las siguientes herramientas:
Vamos a trabajar con un web service de encriptación mediante Triple-DES y MD5 que ofrece dos operaciones :
encriptar. Recibe tres tipos simples: la cadena de texto en claro, la clave de encriptación y un flag para el uso o no de hashing. Devuelve la cadena de texto encriptada.
desencriptar. Recibe un tipo complejo compuesto por tres tipos simples: la cadena de texto encriptada, la clave utilizada en la encriptación y el flag para indicar el uso de hashing. Devuelve la cadena de texto desencriptada.
El uso de tipos simples o complejos es una cuestión de diseño, y en nuestro caso lo hacemos así para ampliar la cobertura de capacidades de WSCF.blue.
Definición de los tipos del documento con XML Schema
La definición del tipo de datos complejo lo implementamos mediante un XML Schema. Se muestra a continuación, y puede descargarse aquí: cryptoSchema.xsd
<?xml version=
Text
"1.0"
encoding=
Text
"UTF-8"
?>
<!--
cryptoSchema.xsd
Tutorial: Contract-
Text
First
web services con Visual Studio 2008
www.adictosaltrabajo.com - Ivan Garcia Puebla
-->
<xsd:
Implementamos el contrato del web service en un descriptor WSDL concreto. Utilizaremos el Schema anterior, SOAP sobre HTTP, y el resto de detalles se muestran a continuación:
A partir del descriptor generaremos los stubs en C# del servicio que ofrezca las dos operaciones; posteriormente damos cuerpo al webservice y añadimos la lógica de negocio. En .NET podemos hacerlo a través del plugin/add-in para Visual Studio 2008, WSCF.blue. En el MSDN hay un interesante artículo publicado, http://msdn.microsoft.com/en-us/magazine/ee335699.aspx, sobre Contract-First Web Services y WSCF.blue, e incluye el enlace http://se.ethz.ch/~meyer/publications/computer/contract.pdf al artículo original de Bertrand Meyer: Applying «Design by Contract», aparecido en el IEEE en 1992
Instalación de WSCF.blue
Descargamos el instalador del acceso Download de http://www.codeplex.com/WSCFblue/ y lo instalamos siguiendo el asistente, de manera habitual.
Crear el servicio e importar el contrato
En Visual Studio 2008 creamos un nuevo proyecto de tipo Web de Visual C#. Utilizaremos la plantilla: Aplicación de servicio web de ASP.NET y damos como nombre wsEncriptacion. Agregamos una nueva carpeta llamada wscfEncriptacion y a continuación nuestros WSDL y Schema:
Proyecto creado en Visual Studio 2008
Bien en el menú Herramientas | Web Services Contract-First o bien pulsando con el botón derecho sobre cryptoServiceWSDL.wsdl, accedemos a las funcionalidades de WSCF.blue y escogemos Generate Web Service Code:
Menú contextual de WSCF.blue
Establecemos las opciones de generación de código siguientes:
Generación de código con WSCF.blue
Como se observa en la imagen, hemos establecido las opciones siguientes:
Server-side stub: vamos a generar el web service proveedor
Format SOA Actions: determinamos que las acciones SOAP de cada operación del contrato sigan el formato estándar de contratos de web services: <namespace>/<service>/<operation>[Response]
Separate files: cada tipo de dato del servicio web será generado en un fichero de C# distinto
Adjust casing: los tipos de datos generados seguirán la notación de .NET
Use synchronization context: el contexto determinará en qué hilo se ejecutará el web service
Generate a regular service class …: permitiremos generar métodos en donde implementar la lógica del servicio
Estas opciones son expuestas a modo de ejemplo. Cada proyecto requerirá de la configuración más adecuada para sus propósitos. La documentación se encuentra en: https://www.thinktecture.com/
Pulsamos en Generate y en unos instantes se confirmará la ejecución correcta de la operación:
Código generado correctamente
En el explorador de soluciones podemos observar el código que ha sido generado:
Stubs generados del web service proveedor
Implementar el web service
La clase cryptoServiceWSDLPortType es la que finalmente alberga los métodos donde se implementará la lógica de negocio de nuestro servicio web. En su definición vemos que es una clase derivada de la interfaz IcryptoServiceWSDLPortType. En este tutorial implementaremos el fichero ASP web service, Service1.asmx, directamente con estos métodos. Para ello editamos el código de Service1.asmx y trasladamos el código de cryptoServiceWSDLPortType.cs de la siguiente manera.
Los atributos de compilación de la clase cryptoServiceWSDLPortType los establecemos en la clase de Service1
La clase Service1 la convertimos en derivada de IcryptoServiceWSDLPortType
Los métodos encriptar y desencriptar de cryptoServiceWSDLPortType los copiamos como métodos públicos no virtuales en la clase de Service1 con el atributo [WebService]
Finalmente eliminamos de cada método la sentencia de lanzamiento de excepción y añadimos nuestra lógica de encriptación/desencriptación. En este caso me he basado en el post: http://www.csharper.net/blog/library_encrypt_and_decrypt_methods_using_tripledes_and_md5.aspx. En resumen, Service1.asmx.cs queda de la forma:
Text
using
System;
Text
using
System.Collections.Generic;
Text
using
System.Linq;
Text
using
System.Web;
Text
using
System.Web.Services;
Text
using
System.Text;
Text
using
System.Security.Cryptography;
Text
namespace
wsEncriptacion
{
Text
/// <summary>
Text
/// Service1.asmx
Text
/// Tutorial: Contract-First web services con Visual Studio 2008
Nuestro web service ha sido implementado correctamente partiendo de la descripción de un contrato.
Conclusión
En el Microsoft SDK existe la utilidad ServiceModel Metadata Utility Tool (Svcutil.exe) que permite asimismo generar las clases proxy del web service a partir del descriptor. Utilizar WSCF.blue no requiere de la instalación del SDK, no obstante, y aporta unas capacidades añadidas al propio IDE Visual Studio bastante interesantes para propósitos Contract-first.
El Complex Problem Solving (CPS) es un proceso estructurado basado en herramientas, técnicas y actitudes que nos facilita la resolución de problemas complejos.
Descubre cómo el diseño y la psicología del comportamiento utilizan sesgos cognitivos para influir en la toma de decisiones de los usuarios y potenciar la persuasión.
En este artículo exploraremos cómo utilizar ZenWave360 para generar un proyecto completo de Spring Boot con Kotlin a partir de un modelo DSL de Lenguaje Ubicuo.