Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 24 de abril de 2018
ASP.NET Core MVC Hace unos días hablábamos de las, a veces desconocidas, redirecciones HTTP 303, 307 y 308, y comentábamos el por qué de su existencia y los escenarios en los que debían ser utilizadas si queremos seguir de forma más estricta el protocolo HTTP a la hora de implementar APIs o aplicaciones.

Pues bien, al hilo de esto, en este post veremos muy rápidamente cómo podemos implementar estas redirecciones en ASP.NET Core MVC que, como veréis, nos lo pone bastante fácil.

En ASP.NET Core MVC, las redirecciones se implementan básicamente retornando resultados de tipos como RedirectResult, LocalRedirectResult, RedirectToActionResult o RedirectToRouteResult. El fin de todos ellos es el mismo: retornar al lado cliente una respuesta con el código HTTP 3xx indicando en el encabezado location la dirección del recurso donde se encuentra el recurso solicitado.

Normalmente no instanciaremos estas clases directamente, sino que utilizaremos los atajos proporcionados por la clase Controller, como en el siguiente ejemplo:
public class RedirectionTestController: Controller
{
    public IActionResult Temporal() 
    {
        // Returns HTTP 302 pointing to /redirectiontest/ok
        return RedirectToAction("Ok"); 
    }

    public IActionResult Ok()
    {
        return Content("Ok!");
    }
}
En la clase Controller existen multitud de métodos destinados a facilitar la construcción de retornos de los distintos tipos redirección, que utilizaremos dependiendo de cómo queramos indicar el destino de las mismas. Por ejemplo:
  • El método Redirect() permite generar redirecciones hacia URL arbitrarias.
  • RedirectToAction() nos permitirá generar redirecciones hacia controladores/acciones de nuestra aplicación.
  • RedirectToRoute() generará redirecciones partiendo de los parámetros de ruta especificados.
  • RedirectToPage() genera redirecciones hacia páginas Razor.
  • LocalRedirect() permite generar redirecciones hacia recursos locales, pertenecientes al mismo sitio web.
Por defecto estas redirecciones serán transitorias (HTTP 302), aunque cada uno de estos métodos presenta una variante, cuya denominación acaba en “Permanent”, que permite generar redirecciones permanentes (HTTP 301), como en el siguiente ejemplo:
public class RedirectionTestController: Controller
{
    ...
    public IActionResult Permanent() 
    {
        // Returns a permanent redirection (HTTP 301) to /redirectiontest/ok
        return RedirectToActionPermanent("Ok");
    }    
}
Petición POST con redirección HTTP 307De esta forma, mediente llamadas a métodos como RedirectToActionPermanent(), RedirectToRoutePermanent() o RedirectToPagePermanent() podremos crear objetos IActionResult que, al ejecutarse, generarán redirecciones permanentes.

Pues bien, observad que hasta ahora sólo hemos hablado de redirecciones HTTP 301 y 302, que son las más habituales, pero ASP.NET Core MVC también nos ofrece facilidades para implementar los códigos 307 y 308.

Como sabemos, lo que estos dos tipos de redirección aportan sobre los conocidos HTTP 301 y 302 es, básicamente, que con ellos indicamos explícitamente al agente de usuario que la petición a la dirección indicada en el encabezado location debe ejecutarse respetando el verbo original.

Por ello, si observamos las ayudas e intellisense cuando vamos a retornar una redirección observaremos que, por cada uno de los métodos de generación de redirecciones que hemos comentado antes, existe un método adicional cuyo nombre finaliza por “PreserveMethod”.

Por ejemplo, en el siguiente bloque de código utilizamos estos métodos para generar redirecciones a acciones con códigos 307 y 308:
public IActionResult TemporalPreserve() 
{
    // HTTP 307, temporal redirect preserving method
    return RedirectToActionPreserveMethod("Ok");
}  
public IActionResult PermanentPreserve() 
{
    // HTTP 308, permanent redirect preserving method
    return RedirectToActionPermanentPreserveMethod("Ok"); // 
}  
Y de nuevo, tendremos este sufijo en prácticamente todos los métodos que generan resultados de redirección, ya sean transitorios o permanentes: RedirectPreserveMethod(), RedirectToRoutePreserveMethod(), LocalRedirectPermanentPreserveMethod(), etc., por lo que siempre tendremos a mano la posibilidad de optar por unos códigos de retorno u otros y ser más explícitos en las respuestas.

Hey, ¿y los métodos y clases para generar redirecciones HTTP 303?

Pues me temo que se quedaron en el camino :(

De momento no existen formas directas de generar este tipo de redirecciones con las herramientas proporcionadas de serie en el framework. Supongo que el motivo se deberá a que se entiende que su uso no será frecuente y, supongo también, para no “ensuciar” la clase Controller con demasiadas variantes de métodos de generación de redirecciones.

Pero bueno, esto no quiere decir que sea difícil conseguirlo: obviamente nada nos impide retornar un StatusCode(303) o bien un  crear nuestro propio IActionResult personalizado para este tipo de redirecciones, algo que no se antoja demasiado complicado.

Venga, os lo dejo como deberes ;)

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!