Creación de Servicio Web SOAP
Explicaremos cómo crear un servicio SOAP en .NET utilizando Hibernate para conectar a una base de datos SQL Server.
Primeramente se va crear un nuevo proyecto, luego buscar la opción Visual C#, seleccionar WCF y escoger la opción “Aplicación de servicios WCF” y colocar un nombre.
Cambiar de nombre al servicio “Service1.svc” que se crea por defecto. Para este ejemplo colocaremos el nombre “Clientes.svc”. De igual manera cambiaremos“IService1.cs” por “IClientes.cs”.
Agregar al proyecto las carpetas “Dominio” y “Persistencia”. Adicionar a la solución la carpeta “Librerias” la cual contendrá los archivos “Iesi.Collections.dll” y“NHibernate.dll”. Usar el explorador de Windows para ir a la carpeta donde se encuentra nuestro proyecto y crear una carpeta llamada "Librerias" que contenga los archivos que incluiremos en la librería, luego arrastrarlos hacia la carpeta “Librerias” que se encuentra en nuestra solución.
El siguiente paso dentro de nuestro proyecto es dar clic derecho sobre la opción “References” y escoger la opción “Agregar Referencia”. Escoger la pestaña “Examinar” y seleccionar los archivos que colocamos en la carpeta “Librerias”.
Ahora crearemos la clase “Conexión.cs” dentro de la carpeta “Persistencia”. Con el siguiente código:
public class ConexionUtil
{
public static string ObtenerCadena()
{
return "Data Source=(local);Initial Catalog=BD_ALQUILER_VEHICULOS;Integrated Security=SSPI;";
}
}
Asimismo, la clase “NHibernateHelper.cs” con el siguiente código
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
using NHibernate.Cfg;
namespace TransaccionesServices.Persistencia
{
public class NHibernateHelper
{
private static ISessionFactory _Fabrica;
private static ISessionFactory Fabrica
{
get
{
if (_Fabrica == null)
{
var _Conf = new Configuration();
_Conf.SetProperty("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
_Conf.SetProperty("connection.driver_class", "NHibernate.Driver.SqlClientDriver");
_Conf.SetProperty("connection.connection_string", ConexionUtil.ObtenerCadena());
_Conf.SetProperty("adonet.batch_size", "10");
_Conf.SetProperty("show_sql", "true");
_Conf.SetProperty("dialect", "NHibernate.Dialect.MsSql2000Dialect");
_Conf.SetProperty("command_timeout", "60");
_Conf.SetProperty("query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
_Conf.AddAssembly(typeof(NHibernateHelper).Assembly);
_Fabrica = _Conf.BuildSessionFactory();
}
return _Fabrica;
}
}
public static ISession ObtenerSesion()
{
return Fabrica.OpenSession();
}
public static void CerrarFabrica()
{
_Fabrica = null;
}
}
}
Luego crear la clase “BaseDAO” con el siguiente código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
namespace TransaccionesServices.Persistencia
{
public class BaseDAO<Entidad, Id>
{
public Entidad Crear(Entidad entidad)
{
using (ISession sesion = NHibernateHelper.ObtenerSesion())
{
sesion.Save(entidad);
sesion.Flush();
}
return entidad;
}
public Entidad Obtener(Id id)
{
using (ISession sesion = NHibernateHelper.ObtenerSesion())
{
return sesion.Get<Entidad>(id);
}
}
public Entidad Modificar(Entidad entidad)
{
using (ISession sesion = NHibernateHelper.ObtenerSesion())
{
sesion.Update(entidad);
sesion.Flush();
}
return entidad;
}
public void Eliminar(Entidad entidad)
{
using (ISession sesion = NHibernateHelper.ObtenerSesion())
{
sesion.Delete(entidad);
sesion.Flush();
}
}
public ICollection<Entidad> ListarTodos()
{
using (ISession sesion = NHibernateHelper.ObtenerSesion())
{
ICriteria busqueda = sesion.CreateCriteria(typeof(Entidad));
return busqueda.List<Entidad>();
}
}
}
}
Luego se procede a crear la clase Cliente con el siguiente código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using GestionServices.Dominio;
using GestionServices.Persistencia;
namespace GestionServices
{
public class Clientes : IClientes
{
private ClienteDAO clienteDAO = null;
private ClienteDAO ClienteDAO
{
get
{
if (clienteDAO == null)
clienteDAO = new ClienteDAO();
return clienteDAO;
}
}
UsuariosWS.UsuariosClient proxyUsuarios = new UsuariosWS.UsuariosClient();
public Mensaje CrearCliente(string nombre, string dni, DateTime fecha_nacimiento, string direccion, string distrito, string email, string clave, string brevete)
{
Mensaje mensajeRetorno = new Mensaje();
UsuariosWS.Mensaje mensajeUsuario = proxyUsuarios.CrearUsuario(nombre, clave, "Cliente");
if (mensajeUsuario.codigoMensaje == "E")
{
mensajeRetorno.codigoMensaje = mensajeUsuario.codigoMensaje;
mensajeRetorno.codigoElemento = mensajeUsuario.codigoElemento;
mensajeRetorno.textMensaje = mensajeUsuario.textMensaje;
return mensajeRetorno;
}
UsuariosWS.Usuario usuarioCreado = proxyUsuarios.ObtenerUsuario(mensajeUsuario.codigoElemento);
Perfil perfilUsuario = new Perfil()
{
Codigo = usuarioCreado.Perfil.Codigo,
Descripcion = usuarioCreado.Perfil.Descripcion
};
Usuario usuarioNuevo = new Usuario()
{
Codigo = usuarioCreado.Codigo,
Clave = usuarioCreado.Clave,
Nombre = usuarioCreado.Nombre,
Estado = usuarioCreado.Estado,
Perfil = perfilUsuario
};
Cliente clienteACrear = new Cliente()
{
Nombre = nombre,
NroDNI = dni,
FechaNacimiento = fecha_nacimiento,
Direccion = direccion,
Distrito = distrito,
Email = email,
Brevete = brevete,
Usuario = usuarioNuevo
};
Mensaje mensajeRequisitos = ValidarRequisitos(clienteACrear);
if (mensajeRequisitos.codigoMensaje == "E")
{
UsuariosWS.Mensaje mensajeDummy = proxyUsuarios.EliminarUsuario(usuarioNuevo.Codigo);
return mensajeRequisitos;
}
else if (ClienteDAO.Crear(clienteACrear) != null)
{
mensajeRetorno.codigoMensaje = "S";
mensajeRetorno.textMensaje = "Cliente " + nombre + " creado exitosamente";
}
else
{
UsuariosWS.Mensaje mensajeDummy = proxyUsuarios.EliminarUsuario(usuarioNuevo.Codigo);
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "No se pudo crear el cliente " + nombre;
}
return mensajeRetorno;
}
public Cliente ObtenerCliente(int codigo)
{
return ClienteDAO.Obtener(codigo);
}
public Mensaje ModificarCliente(int codigo, string nombre, string dni, DateTime fecha_nacimiento, string direccion, string distrito, string email, string clave, string brevete)
{
Mensaje mensajeRetorno = new Mensaje();
Cliente clienteAModificar = ClienteDAO.Obtener(codigo);
Usuario usuarioBkp = clienteAModificar.Usuario;
UsuariosWS.Mensaje mensajeUsuario = proxyUsuarios.ModificarUsuario(clienteAModificar.Usuario.Codigo,
email,
clave,
clienteAModificar.Usuario.Perfil.Descripcion,
clienteAModificar.Usuario.Estado);
if (mensajeUsuario.codigoMensaje == "E")
{
mensajeRetorno.codigoMensaje = mensajeUsuario.codigoMensaje;
mensajeRetorno.codigoElemento = mensajeUsuario.codigoElemento;
mensajeRetorno.textMensaje = mensajeUsuario.textMensaje;
return mensajeRetorno;
}
UsuariosWS.Usuario usuarioModificado = proxyUsuarios.ObtenerUsuario(clienteAModificar.Usuario.Codigo);
Perfil perfilUsuario = new Perfil()
{
Codigo = usuarioModificado.Perfil.Codigo,
Descripcion = usuarioModificado.Perfil.Descripcion
};
Usuario usuarioNuevo = new Usuario()
{
Codigo = usuarioModificado.Codigo,
Clave = usuarioModificado.Clave,
Nombre = usuarioModificado.Nombre,
Estado = usuarioModificado.Estado,
Perfil = perfilUsuario
};
clienteAModificar.Codigo = codigo;
clienteAModificar.Nombre = nombre;
clienteAModificar.NroDNI = dni;
clienteAModificar.FechaNacimiento = fecha_nacimiento;
clienteAModificar.Direccion = direccion;
clienteAModificar.Distrito = distrito;
clienteAModificar.Email = email;
clienteAModificar.Brevete = brevete;
clienteAModificar.Usuario = usuarioNuevo;
Mensaje mensajeRequisitos = ValidarRequisitos(clienteAModificar);
if (mensajeRequisitos.codigoMensaje == "E")
{
UsuariosWS.Mensaje mensajeDummy = proxyUsuarios.ModificarUsuario(usuarioBkp.Codigo,
usuarioBkp.Nombre,
usuarioBkp.Clave,
usuarioBkp.Perfil.Descripcion,
usuarioBkp.Estado);
return mensajeRequisitos;
}
if (ClienteDAO.Modificar(clienteAModificar) != null)
{
mensajeRetorno.codigoMensaje = "S";
mensajeRetorno.textMensaje = "Cliente " + nombre + " modificado exitosamente";
}
else
{
UsuariosWS.Mensaje mensajeDummy = proxyUsuarios.ModificarUsuario(usuarioBkp.Codigo,
usuarioBkp.Nombre,
usuarioBkp.Clave,
usuarioBkp.Perfil.Descripcion,
usuarioBkp.Estado);
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "No se pudo modificar el cliente " + nombre;
}
return mensajeRetorno;
}
public Mensaje EliminarCliente(int codigo)
{
Mensaje mensajeRetorno = new Mensaje();
Cliente clienteAEliminar = ClienteDAO.Obtener(codigo);
UsuariosWS.Mensaje mensajeUsuario = proxyUsuarios.DesactivarUsuario(clienteAEliminar.Usuario.Codigo);
if (mensajeUsuario.codigoMensaje == "E")
{
mensajeRetorno.codigoMensaje = mensajeUsuario.codigoMensaje;
mensajeRetorno.codigoElemento = mensajeUsuario.codigoElemento;
mensajeRetorno.textMensaje = mensajeUsuario.textMensaje;
return mensajeRetorno;
}
ClienteDAO.Eliminar(clienteAEliminar);
if (ClienteDAO.Obtener(codigo) == null)
{
mensajeRetorno.codigoMensaje = "S";
mensajeRetorno.textMensaje = "Cliente " + clienteAEliminar.Nombre + " eliminado exitosamente";
}
else
{
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "No se pudo eliminar el cliente " + clienteAEliminar.Nombre;
}
return mensajeRetorno;
}
public List<Cliente> ListarClientes()
{
return ClienteDAO.ListarTodos().ToList();
}
public Cliente ObtenerClienteXEmail(string email)
{
return ClienteDAO.ObtenerXEmail(email);
}
public Cliente ObtenerClienteXDNI(string dni)
{
return ClienteDAO.ObtenerXDNI(dni);
}
public Mensaje ValidarRequisitos(Cliente cliente)
{
Mensaje mensajeRetorno = new Mensaje();
// Debe ser mayor de edad
DateTime fecNac = new DateTime(cliente.FechaNacimiento.Year, cliente.FechaNacimiento.Month, cliente.FechaNacimiento.Day);
DateTime fecHoy = DateTime.Now;
TimeSpan ts = fecHoy - fecNac;
int diferenciaDias = ts.Days;
if (diferenciaDias / 365 <= 18)
{
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "El cliente es menor de edad";
return mensajeRetorno;
}
// Licencia de conducir válida
if (("Q" + cliente.NroDNI) != cliente.Brevete)
{
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "El número de licencia es inválido";
return mensajeRetorno;
}
// Único E-mail
Cliente clienteDummy = ClienteDAO.ObtenerXEmail(cliente.Email);
if (clienteDummy != null)
{
if (clienteDummy.Codigo != cliente.Codigo)
{
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "Ya existe un cliente registrado con este correo";
return mensajeRetorno;
}
}
// único Número de DNI
clienteDummy = ClienteDAO.ObtenerXDNI(cliente.NroDNI);
if (clienteDummy != null)
{
if (clienteDummy.Codigo != cliente.Codigo)
{
mensajeRetorno.codigoMensaje = "E";
mensajeRetorno.textMensaje = "Ya existe un cliente registrado con este número de DNI";
return mensajeRetorno;
}
}
mensajeRetorno.codigoMensaje = "S";
mensajeRetorno.textMensaje = "Requisitos validados correctamente";
return mensajeRetorno;
}
}
}
Luego editar el archivo “IClientes.cs” con el siguiente código:
namespace GestionServices
{
[ServiceContract]
public interface IClientes
{
[OperationContract]
Mensaje CrearCliente(string nombre, string dni, DateTime fecha_nacimiento, string direccion, string distrito, string email, string clave, string brevete);
[OperationContract]
Cliente ObtenerCliente(int codigo);
[OperationContract]
Mensaje ModificarCliente(int codigo, string nombre, string dni, DateTime fecha_nacimiento, string direccion, string distrito, string email, string clave, string brevete);
[OperationContract]
Mensaje EliminarCliente(int codigo);
[OperationContract]
List<Cliente> ListarClientes();
[OperationContract]
Cliente ObtenerClienteXDNI(string dni);
[OperationContract]
Cliente ObtenerClienteXEmail(string email);
[OperationContract]
Mensaje ValidarRequisitos(Cliente cliente);
}
}
Como punto final crearemos los archivos XML en la carpeta “Dominio”.
A continuación el archivo “Cliente.hbm.xml”:
A continuación el archivo “Cliente.hbm.xml”:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="GestionServices"
namespace="GestionServices.Dominio"
default-lazy="false">
<class name="Cliente" table="t_clientes">
<id name="Codigo" column="codigo">
<generator class="increment" />
</id>
<property name="Nombre" column="nombre" />
<property name="NroDNI" column="nro_dni" />
<property name="FechaNacimiento" column="fecha_nacimiento" />
<property name="Direccion" column="direccion" />
<property name="Distrito" column="distrito" />
<property name="Email" column="email" />
<property name="Brevete" column="brevete" />
<many-to-one name="Usuario" column="codigo_usuario" />
</class>
</hibernate-mapping>
0 comentarios:
Publicar un comentario
Suscribirse a Enviar comentarios [Atom]
<< Inicio