Manejo de Excepciones en .NET
En esta oportunidad veremos cómo hacer uso de las excepciones en un Servicio Web REST, para lo cual, tomaremos como referencia el Servicio Web “Productos” del caso que hemos venido desarrollando en entradas anteriores.
En nuestra carpeta “Dominio” agregar la clase “Validacion.cs” con el siguiente código:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime.Serialization; namespace ProductosService.Dominio { [DataContract] public class Validacion { [DataMember] public string Error { get; set; } } }
Luego, dentro de la carpeta “Persistencia”, editemos el archivo “ProductoDAO.cs” y adicionemos el siguiente método:
public Producto ObtenerProductoPorNombre(string No_Producto) { Producto productoEncontrado = null; string sql = "SELECT * FROM t_producto WHERE No_Producto = @No_Producto"; using (SqlConnection con = new SqlConnection(Conexion.Cadena)) { con.Open(); using (SqlCommand com = new SqlCommand(sql, con)) { com.Parameters.Add(new SqlParameter("@No_Producto", No_Producto)); using (SqlDataReader resultado = com.ExecuteReader()) { if (resultado.Read()) { productoEncontrado = new Producto() { Co_Producto = resultado["Co_Producto"].ToString(), No_Producto = (string)resultado["No_Producto"], Ss_Precio = (decimal)resultado["Ss_Precio"], Qt_Stock = (int)resultado["Qt_Stock"] }; } } } } return productoEncontrado; }
Luego será necesario modificar el archivo “Productos.svc”, con el siguiente código:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; using ProductosService.Persistencia; using ProductosService.Dominio; using System.Net; namespace ProductosService { public class Productos : IProductos { private ProductoDAO dao = new ProductoDAO(); public Producto CrearProducto(Producto productoACrear) { if (dao.ObtenerProductoPorNombre(productoACrear.No_Producto) == null) { return dao.Crear(productoACrear); } else { throw new WebFaultException<Validacion>(new Validacion { Error = "El producto (" + productoACrear.No_Producto + ") ya existe." }, HttpStatusCode.BadRequest); } } public Producto ObtenerProducto(string Co_Producto) { return dao.Obtener(Co_Producto); } public Producto ModificarProducto(Producto productoAModificar) { if (dao.ObtenerProductoPorNombre(productoAModificar.No_Producto) == null) { return dao.Modificar(productoAModificar); } else { throw new WebFaultException<Validacion>(new Validacion { Error = "El producto (" + productoAModificar.No_Producto + ") ya existe." }, HttpStatusCode.BadRequest); } } public void EliminarProducto(string Co_Producto) { dao.Eliminar(Co_Producto); } public List<Producto> ListarProductos() { return dao.ListarProductos(); } } }
Agregar a nuestro proyecto “ProductosTEST” la clase “Validacion.cs”.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductosTEST { class Validacion { public string Error { get; set; } } }
Ahora pasaremos a modificar nuestro archivo “ProductosTest.cs”, adicionando el siguiente método:
[TestMethod] public void TestCrearProductoNegativo() { // Prueba de creacion de producto via HTTP POST string postdata = "{\"No_Producto\":\"LAPTOP HP PAVILION\",\"Ss_Precio\":\"2599.99\",\"Qt_Stock\":\"150\"}"; byte[] data = Encoding.UTF8.GetBytes(postdata); HttpWebRequest req = (HttpWebRequest)WebRequest .Create("http://localhost:32641/Productos.svc/Productos"); req.Method = "POST"; req.ContentLength = data.Length; req.ContentType = "application/json"; var reqStream = req.GetRequestStream(); reqStream.Write(data, 0, data.Length); try { var res = (HttpWebResponse)req.GetResponse(); StreamReader reader = new StreamReader(res.GetResponseStream()); string productoJson = reader.ReadToEnd(); JavaScriptSerializer js = new JavaScriptSerializer(); Producto productoCreado = js.Deserialize<Producto>(productoJson); Assert.AreEqual("LAPTOP HP PAVILION", productoCreado.No_Producto); Assert.AreEqual(2599.99m, productoCreado.Ss_Precio); Assert.AreEqual(150, productoCreado.Qt_Stock); } catch (WebException ex) { HttpWebResponse resError = (HttpWebResponse)ex.Response; StreamReader reader = new StreamReader(resError.GetResponseStream()); string error = reader.ReadToEnd(); JavaScriptSerializer js = new JavaScriptSerializer(); Validacion exception = js.Deserialize<Validacion>(error); Assert.AreEqual("El producto (LAPTOP HP PAVILION) ya existe.", exception.Error); } }
Finalmente probar nuestro método y verificar también en la base de datos, que el registro duplicado no se registró.
Bueno esto seria todo por hoy, espero que este tema les haya sido útil.
Gracias !!!
Gracias !!!
No hay comentarios:
Publicar un comentario