martes, 24 de abril de 2018
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
Normalmente no instanciaremos estas clases directamente, sino que utilizaremos los atajos proporcionados por la clase
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
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:
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
Pero bueno, esto no quiere decir que sea difícil conseguirlo: obviamente nada nos impide retornar un
Venga, os lo dejo como deberes ;)
Publicado en Variable not found.
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.
public class RedirectionTestController: Controller
{
...
public IActionResult Permanent()
{
// Returns a permanent redirection (HTTP 301) to /redirectiontest/ok
return RedirectToActionPermanent("Ok");
}
}
De 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!
Enviar un nuevo comentario