En las aplicaciones web de hoy en día, hay una total dependencia del lenguaje Javascript y se usa todo el tiempo para el manejo de todo tipo de comportamientos (utilización de frameworks, carga y manipulación de elementos DOM, etc.). Muchas veces, puede sernos útil para determinar la forma específica que las solicitudes entran en nuestra aplicación y definir su origen para que puedas limitar a lo que un usuario puede y no puede acceder a través de peticiones GET y POST llanas.
IsAjaxRequest () = false;
Anteriormente, las aplicaciones ASP.NET MVC podían comprobar fácilmente si la solicitud se hacía a través de AJAX con el método bien llamado IsAjaxRequest(), un método disponible en el objeto Request como puedes ver a continuación:
public ActionResult YourActionName() { // Check if the request is an AJAX call var isAjax = Request.IsAjaxRequest(); // Do something about it. }
Un ejemplo más común para esto podría ser la de construir un ActionFilter que se pueda aplicar fácilmente como un atributo para permitir solicitudes que vienen a través de AJAX:
[AjaxOnly] public ActionResult YourActionName() { // Omitido por brevedad }
Antiguas versiones de MVC3 tenían este atributo ya incorporado, por lo tanto si lo quieres poner en práctica, podrías utilizar simplemente algo así como:
public class AjaxOnlyAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (!filterContext.HttpContext.Request.IsAjaxRequest()) { filterContext.Result = new HttpNotFoundResult(); } } }
Sin embargo, como uno de los muchos cambios radicales que llegaron debido al lanzamiento de MVC6, verás que este método ya no existe.
[AjaxOnly] en MVC6
El IsAjaxRequest() actualmente funciona simplemente realizando un chequeo del X-Requested-With header como se ve puede ver en la actual implementación de la funcion de MV5:
public static bool IsAjaxRequest(this HttpRequestBase request) { if (request == null) throw new ArgumentNullException("request"); if (request["X-Requested-With"] == "XMLHttpRequest") return true; if (request.Headers != null) return request.Headers["X-Requested-With"] == "XMLHttpRequest"; return false; }
Ahora que ya varios de los parámetros relacionados han cambiado con MVC 6, la implementación de un atributo [AjaxOnly] tendría que cambiar un poco:
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute { public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action) { return routeContext.HttpContext.Request?.Headers["X-Requested-With"] == "XMLHttpRequest"; } }
Y básicamente eso es todo, puedes simplemente utilizar el atributo [AjaxOnly] en cualquiera de las solicitudes existentes en tu proyecto web y podrás permitir/negar peticiones basándote en si son originarias de AJAX o no.
Por nuestra parte nada más, ya sabes que nos puedes enviar tus propios tutoriales a través de la intranet de la página, o bien proponernos otros temas haciendo uso de los comentarios de más abajo. Un saludo y feliz Halloween.
Fuente: Rion Williams