Hoy vamos a construir un servicio WS SOAP desde cero y tendremos un servicio de Pruebas para emular el consumo del servicio. Así mismo, trabajaremos con una persistencia simple DAO y así guardar/recuperar información de una base de datos SQL Server. Esto último solo es para aprovechar mejor el servicio.
El ejemplo a continuación es un servicio de vehículos, pero puede adaptarse para trabajar con usuarios, productos, animales y/o añadir más objetos.
En la vista observamos 2 proyectos: El servicio WS_SOAP y el WS_TEST_SOAP. En WS_SOAP hemos creado dos carpetas (Dominio y Persistencia) solo para mantener el orden. En Dominio se agregarán las clases de los objetos que iremos añadiendo y en Persistencia estará el archivo de conexión (ConexionUtil) y los métodos de cada clase.
En primer lugar definiremos los atributos de nuestra clase Vehiculo.cs. Nuestro Vehiculo contará con una Placa, será de una Marca y Modelo definidos.
Luego pasaremos a indicar que elementos serán serializados. Esta parte es importante porque a nivel de servicios no se envian variables con sus tipos, sino que pasan tramas de bits que luego serán interpretadas según los metadatos.
Así pues, el DataContract define un espacio de nombre XML para que la información pueda ser almacenada; mientras que los DataMember (uno por cada atributo) indican el nombre con que será representado y que dicho atributo será serializado.
Ahora crearemos una clase de apoyo para conectarnos a la base de datos: ConexionUtil.cs
Solo contiene un método que retorna una cadena de conexión a la base de datos. Recuerden poner el nombre de la base de datos con la que estén trabajando. Si la base de datos no es local, en Data Source cambien el punto por la IP del servidor correcto.
Ahora configuramos VehiculoDAO. Una clase que almacenará los métodos de Vehiculo. De momento usaremos 2: Crear y Obtener; pero se pueden añadir incluso los métodos para las validaciones (Documento válido, usuario NO repetido, etc).
Ahora configuremos nuestro servicio web con WS SOAP. Para esto, creamos un nuevo elemento dentro del proyecto.
Click derecho sobre el proyecto --> Agregar... --> Nuevo elemento.
Buscamos "Servicio WCF". Le damos un nombre apropiado y luego click en "Agregar"
Se generará más de 1 archivo:
IVehiculosSVC, VehiculosSVC y VehiculosSVC.svc, este último dependiente del anterior.
El primero tiene una I adelante porque es la Interfaz. Este es un archivo donde solo se declaran las operaciones y da la cara al servicio.
VehiculosSVC.svc.cs es donde se implementan las operaciones declaradas en la Interfaz; es decir, añadiremos aquí la lógica de cada operación.
Por defecto, se abrirá el archivo IVehiculosSVC. Analicemos su estructura.
En primer lugar veremos unas etiquetas llamadas ServiceContract y OperationContract.
El ServiceContract sirve para definir el servicio a brindar, mientras que los OperationContract indican que operaciones del servicio se van a exponer y podrán ser consumidas por terceros.
Esto es importante porque nos permite usar nuestros métodos sin exponerlos directamente.
Pasamos a borrar el OperationContract de Ejemplo y agregamos las nuestras (Crear y Obtener).
Para evitar confusiones, nuestras operaciones deben tener nombres distíntos a nuestros métodos. En nuestro caso los métodos tienen nombres básicos como Crear y Obtener mientras las operaciones son CrearVehiculo y ObtenerVehiculo.
Pasamos al archivo VehiculosSVC.svc.cs. Tenemos que implementar las operaciones declaradas en la interfaz. La forma más sencilla es ubicar el cursor sobre la Interfaz a quien implementamos, abrir el menú contextual y seleccionar "Implementar la interfaz..."
Ahora solo tenemos que reemplazar las excepciones indicadas por nuestro código.