sábado, 8 de diciembre de 2012

Validacion con REST en la capa MVC

A continuacion los pasos de un pequeño validacion con REST en una aplicacion MVC
Para nuestro caso vamos a realizar la validacion de no permitir ingresar un nuevo reserva de una cancha de fulbito en el mismo dia, la misma cancha y la misma hora de inicio y fin
Primer Paso.-
Implementamos en nuestra capa Controller lo siguiente para retornar el error de en caso encontrar una reserva con los criterios inicialmente mencionados como se muestra a continuacion

[HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                string postdata = "{\"Codigo\":\"" + collection["Codigo"] + "\",\"Cliente\":\"" + collection["clientes"] + "\",\"Cancha\":\"" + collection["canchas"] + "\" ,\"Fecha\":\"" + collection["txtFechaInicioEmision"] + "\",\"Inicio\":\"" + collection["horaini"] + "\",\"Fin\":\"" + collection["horafin"] + "\",\"Monto\":\"" + collection["Monto"] + "\" }";
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest
                    .Create("http://localhost:3634/Reservas.svc/Reservas");
                req.Method = "POST";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                HttpWebResponse res = null;
                res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string reservaJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Reserva1 recursoCreado = js.Deserialize<Reserva1>(reservaJson);
                return RedirectToAction("Index");

            }
            catch (WebException e)
            {
              HttpWebResponse resError = (HttpWebResponse)e.Response;
                    StreamReader reader2 = new StreamReader(resError.GetResponseStream());
                    string error = reader2.ReadToEnd();
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    string errorMessage = js.Deserialize<string>(error);
                    TempData["mensaje"] = errorMessage;
                    return RedirectToAction("Create");
           
            }

            return RedirectToAction("Index");
        } 
 

 
Segundo Paso.-
Una vez implementado vamos a nuestro servicio REST para mostrar la validacion si en caso existe la reserva con los criterios mencionados en el primer punto

public Reserva CrearReserva(Reserva reservaACrear)
        {
           var existe = ObtenerReserva(reservaACrear);
            if (existe != null)
                throw new WebFaultException<string>("Ya existe una Reserva!!!", HttpStatusCode.NotFound);
            return dao.Crear(reservaACrear);
        }

 Como vemos hemos creado una variable (existe) que va ir a la base de datos a traves del metodo ObtenerReserva y retorna un objeto y si esto objeto es diferente de null capturaremos la exepcion y lo mostraremos en un mensaje en una nuestra vista(aspx)

<h3 style="color:Red"><%= TempData["mensaje"] %></h3> 



 

REST EXCEPTIONS CON MVC

A continuacion como trabajar con las exceptions de rest en MVC.
Primer Paso.-
En nuestra capa de nuestro servicio REST vamos a capturar el error de la  excepcion, para nuestro caso vamos a validar que no se permita crear un nuevo recurso si en caso este ya existiera en la BD , a continuacion la linea de codigo para dicha implementacion

public Recurso CrearRecurso(Recurso recursoACrear)
        {
            var existe = ObtenerRecurso(recursoACrear.Codigo);
            if (existe != null)
                throw new WebFaultException<string>("El Recurso que intento Ingresar Ya Existe!!!", HttpStatusCode.NotFound);
            return dao.Crear(recursoACrear);
        }

 Segundo Paso.-
 En nuestro capa MVC de nuestra capa controller capturaremos la excepcion que nos devuelve el servicio, para el caso de servicio REST el tipo de excepcion es WebException como se muestra a continuacion


[HttpPost]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                if (collection["codigo"] == null || collection["codigo"].Trim().Equals("") || collection["nombre"] == null || collection["precio"]==null)
                {
                 TempData["mensaje"] = "Ingrese todos los datos por favor";
                 HttpWebRequest req1 = (HttpWebRequest)WebRequest
               .Create("http://localhost:5158/Tipos.svc/Tipos");
                 req1.Method = "GET";
                 HttpWebResponse res1 = (HttpWebResponse)req1.GetResponse();
                 StreamReader reader1 = new StreamReader(res1.GetResponseStream());
                 string tipoJson = reader1.ReadToEnd();
                 JavaScriptSerializer js1 = new JavaScriptSerializer();
                 List<Tipo> tipos = js1.Deserialize<List<Tipo>>(tipoJson);
                 var list = new SelectList(tipos, "Codigo", "Nombre");
                 ViewData["tipos"] = list;
                  return View("Create");
                }
                string postdata = "{\"Codigo\":\"" + collection["Codigo"] + "\",\"Nombre\":\"" + collection["nombre"] + "\" ,\"Precio\":\"" + collection["precio"] + "\",\"Tipo\":\"" + collection["tipos"] + "\" }";
                byte[] data = Encoding.UTF8.GetBytes(postdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest
                    .Create("http://localhost:5158/Recursos.svc/Recursos");
                req.Method = "POST";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                var reqStream = req.GetRequestStream();
                reqStream.Write(data, 0, data.Length);
                HttpWebResponse res = null;
                res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string recursoJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Recurso recursoCreado = js.Deserialize<Recurso>(recursoJson);
                return RedirectToAction("Index");
            }catch (WebException e)
                {
                    HttpWebResponse resError = (HttpWebResponse)e.Response;
                    StreamReader reader2 = new StreamReader(resError.GetResponseStream());
                    string error = reader2.ReadToEnd();
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    string errorMessage = js.Deserialize<string>(error);
                    TempData["mensaje"] = errorMessage;

                    HttpWebRequest req = (HttpWebRequest)WebRequest
                .Create("http://localhost:5158/Tipos.svc/Tipos");
                    req.Method = "GET";
                    HttpWebResponse res = (HttpWebResponse)req.GetResponse();
                    StreamReader reader = new StreamReader(res.GetResponseStream());
                    string tipoJson = reader.ReadToEnd();
                    JavaScriptSerializer js1 = new JavaScriptSerializer();
                    List<Tipo> tipos = js1.Deserialize<List<Tipo>>(tipoJson);
                    var list = new SelectList(tipos, "Codigo", "Nombre");
                    ViewData["tipos"] = list;
                    return View("Create");

                }

        }




Tercer Paso.-
Finalmente en nuestra capa vista(aspx) crearemos un etiqueta para almacenar el mensaje que obtengamos de nuestra clase controller proveniente de nuestro servicio REST como se muestra a continuacion

<h3 style="color:Red"><%= TempData["mensaje"] %></h3>

 

jueves, 6 de diciembre de 2012

Cargar un ComboBox con REST en la capa MVC

Para poder llenar un combo box con REST tenemos que realizar basicamente lo siguiente 
  1. En nuestra clase controller realizar la implementacion de un listado con REST y almacenarlo en una variable de tipo list como se muestra en la imagen siguiente
  2. Asi mismo importar las librerias para poder trabajar con REST en la capa controller del MVC
  3.  Finalmente en nuestra capa vista(aspx) llenamos el valor del combo obtenido de nuestra capa controller como se muestra en la imagen siguiente.

miércoles, 5 de diciembre de 2012

Implementando Servicios SOAP con MVC


Implementando servicios SOAP con MVC

¿Como implementar un servicio SOAP con MVC?
¿Como se hace?
¿Cuales son los pasos a seguir ?
Son muchas de las preguntas que me hice al realizar esto por primera vez, pero realizarlo no es muy complejo aqui les dejo los pasos necesarios para esto.
  1. Primero implementamos nuestro servicio SOAP , para mi caso fue (RegistroCliente) como se muestra en la imagen siguiente  
  2.   Seguidamente en nuestro proyecto MVC nos ubicamos en la seccion Services References y hacemos clic derecho sobre la misma y seleccionamos add Service Reference como se muestra en la imagen siguiente
  3.  Despues de ello se mostrara nuestro servicio SOAP en nuestra capa MVC como se muestra en la imagen siguiente
  4. Seguidamente en nuestra capa vista modificaremos la siguiente linea dado que ahora haremos referencia a nuestro servicio SOAP.                                                                      <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<ReservaCancha.RegistroWS.Clientes>>" %>
  5.  Finalmente en nuestra clase controler para este caso la clase Cliente realizaremos la implementacion de nuestro listado utilizando SOAP en la capa MVC y realizando la referencia del mismo como se muestra en la imagen siguiente