Los Handlers son clases que permiten interceptar una el flujo natural de una aplicación para modificar la acción.  

 Se utilizan clases que hereden de estas Interfaces:  

IRouterHandler: esta interfaz tiene el método GetHttpHandler  que captura la ruta y llama a la siguiente clase  

IHttpHandler: con esta interfaz debemos utilizar el método ProcessRequest, aquí es donde se definen las acciones que se van a llevar a cabo. 

Estas dos clases van juntas, una llama a la otra. 

Además de implementar estas clases debemos indicar  en el fichero RouteConfig que llamada es la que debe interceptar y a donde nos la debe redirigir. 

En la tabla de rutas le pides que intercepte la petición para manejarla a tu gusto 

Route table: 

RouteTable.Routes.add(«Petition», new IHttpHandler()) 

Recordad que para añadir un handler no se usa el routesmap, se utiliza route table. 

Tutorial: 

Comenzamos sobre un proyecto MVC  

1)creamos una carpeta «Handlers» 

2)Dentro de la carpeta, creamos una  clase llamada «Handlerwiki», esta clase hereda de IHttpHandler 

public class HandlerWiki : IHttpHandler (se importa la interfaz) 

Esto nos crea el metodo ProcessRequest y el IsReusable: 

public bool IsReusable => throw new NotImplementedException(); 

public void ProcessRequest(HttpContext context) 

        { 

           //esta clase administra la petición y decide donde nos direcciona (por ejemplo a la wikipedia) 

        } 

  1. Para capturar la url se puede usar routesdata.values pero utilizaremos context.request.rawurl para aprender una opción nueva 
  1. Contenido del metodo: 

            String url = context.Request.RawUrl; 

            int barra = url.LastIndexOf(«/») +1; 

            String noticias = url.Substring(barra); 

            String pais  = «https://elpais.com/tag/» + noticias + «/a/»; 

            context.Response.Redirect(pais, true); 

El metodo redirect te permite redirigir a la direccion que indiques. El valor true indica que queremos que cierre nuestra aplicación y vaya a algo externo. 

  1. En este paso nos queda crear la clase que se encarga de interceptar la llamada a la clase  

dentro de la carpeta routing, creamos la clase RouteWiki heredando de IRouteHandler 

public class RouteWiki: IRouteHandler  

Hacemos el using de System.web.Routing e implementando la interfaz que nos crea este metodo: 

public IHttpHandler GetHttpHandler(RequestContext requestContext) 

        { 

            return new HandlerWiki(); 

        } 

Este metodo captura la llamada inicial y enruta al metodo anterior. 

Por hora lo único que hace es capturar la llamada desde el RouteTable y lanza el handler. 

  1. Vamos al fichero RouteConfig y añadimos una nueva ruta:  

RouteTable.Routes.Add(«Noticias», new Route(«Noticias/{noticia}», new RouteWiki())); 

RouteTable.Routes.Add(«UnNombreCualquiera», new Route(«NuevaRuta/{ValorPasadoPorParametro}», new HandlerQueSeEncarga())); 

*Se utiliza routeTable en vez de map route.* 

Vamos a probar la app: 

  1. En Cualquier pagina incluimos unos action link con nombres de provincias 

        @Html.ActionLink(«Magreb», «magreb», «Noticias») 

        @Html.ActionLink(«Europa», «europa», «Noticias») 

        @Html.ActionLink(«Opinion», «opinion», «Noticias») 

        @Html.ActionLink(«Latinoamerica», «latinoamerica», «Noticias») 

@Html.ActionLink(«Nombre descriptivo», «valor parado por parametro», «Controlador») 

¡OJO! Estos actionLink tienen que coincidir con el routeTable, el manejador y el parametro… 

Al clicar sobre ellos deberia llevarnos a las noticias de El Pais de ese area.  

SEGUNDA PARTE DE LA PRACTICA// MENSAJES DE ERROR// REDIRECCIONES EN EL ROUTEHANDLER 

En esta parte haremos que la clase Handlerwiki evalue los valores pasados por parametros y lance excepciones en caso de asi quererirlo nosotros. 

En este caso vamos a establecer que, por ejemplo, no se pueda entrar en la zona de opinión y magreb. En ese caso deberiamos evaluar dentro del metodo ProcessRequest(). 

Para indicar que zonas están prohibidas se puede hacer de varias maneras: 

  1. incluyéndolo en el ProcessRequest sin más 
  2. Haciendo desde el processRequest una consulta a base de datos donde este incluidas las áreas prohibidas 
  3. Haciendo una lista de Strings desde el route.config y pasarla como parámetro 

En esta practica vamos a hacer la 3ª opción para aprender a pasar valores por parámetro a Handlers aunque en un entorno real es preferible usar la 2ª opción  

 Para ello:  

  1. vamos al routeconfig: 

Creamos la lista de coincidencias  

 List<String> bloqueos = new List<string>(); 

            bloqueos.Add(«magreb»); 

            bloqueos.Add(«opinion»); 

  1. La pasamos por parametro en la RouteTable: 

RouteTable.Routes.Add(«Noticias», new Route(«Noticias/{noticia}», new RouteWiki(bloqueos))); 

  1. Vamos al routewiki: Aquí estamos haciendo llegar los datos desde el routetable hasta el handler. 
  1. Inyectamos en el contructor la lista de bloqueados 

private List<String> bloqueos; 

        public RouteWiki(List<String> bloqueos) 

        { 

            this.bloqueos = bloqueos; 

        } 

  1. Pasamos la lista como parametro al handler. 

        public IHttpHandler GetHttpHandler(RequestContext requestContext) 

        { 

            return new HandlerWiki(this.bloqueos, requestContext); 

  1. Modificamos la clase handlerWiki para que reciba y utilice la información 
    1. Cambiamos el constructor para inyectar la lista de bloqueados, además del contexto 

        private List<String> bloqueos; 

        private RequestContext requestContext; 

        public HandlerWiki(List<String> bloqueos, RequestContext requestContext) 

        { 

            this.bloqueos = bloqueos; 

            this.requestContext = requestContext; 

        } 

  1. Modificamos el metodo processRequest() para que evalue los datos: 

public void ProcessRequest(HttpContext context) 

        { 

//en vez de obtener la infromacion tratando la url como string podemos usar 

//RouteValueDirectory y sacar los valores pidiendoselos al contexto. 

            RouteValueDictionary rutas = this.requestContext.RouteData.Values; 

            //de aqui sacamos los valores que nos pasan del mapeo 

            String noticias = rutas[«nombreseccion»].ToString(); 

            if (this.bloqueos.Contains(noticias)) 

            { 

//para añadir una excepcion lo hacemos también desde el contexto  

                context.AddError(new Exception(«Las noticias sobre  » + noticia + » no estan permitidas»)); 

                //al añadir una excepcion se anula todo el flujo de datos 

            } 

//si no hay errores 

 String pais  = «https://elpais.com/tag/» + noticias + «/a/»; 

            context.Response.Redirect(pais, true); 

        } 

Si probamos la aplicación, en la zona que da error nos salta la pantalla de error, si queremos que la aplicación tenga un flujo normal podemos redireccionar a la pantalla principal en vez de sacar una excepción. 

Si no incluyésemos la línea de redirección buscaría el controlador «Noticias», el cual habría que crear. En este caso no esta creado porque nuestro método siempre redirecciona a otra página. 

Este post ha sido realizado por Enrique González, estudiante de Tajamar en el curso Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin durante el año académico 2018-2019 

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.