Permitir peticiones CORS en .NET MVC

Comentar
Compartir
Javascript

Hace poco he tenido que habilitar las peticiones CORS en un API Rest implementada con C# .NET MVC 3.0, y pese a que la solución es extremadamente sencilla, es bueno tenerla cerca para el futuro o para otras personas que se encuentren con la misma necesidad.

¿Qué es CORS?

El término CORS quiere decir Cross-origin resource sharing y es un mecanismo que permite a JavaScript hacer peticiones HttpRequests a otro dominio distinto al que provee el código JavaScript.

¿Por qué hay que permitir CORS?

Este tipo de peticiones suelen ser rechazadas por los navegadores, por motivos de seguridad (same-origin policy). Pero cuando desarrollamos un API o un servicio web que va a ser consumido desde JavaScript, es necesario habilitarlo.

Si no lo hacemos tendremos un problema, ya que cuando hagamos una petición XDomainRequest o $.ajax recibiremos un error como el siguiente:

En Chrome

XMLHttpRequest cannot load YOURREQUESTEDURI. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘null’ is therefore not allowed access.

En Internet Explorer

SCRIPT5: Acceso denegado.

O en Firefox simplemente no se ejecuta.

Solución

En .NET MVC, la manera más fácil es generar un atributo para decorar las acciones (o el controlador completo) al que queramos permitir el acceso CORS.

[code lang=”csharp”]
namespace ExampleNamespace.Helper
{
public class AllowCrossSiteJson : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

filterContext.RequestContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", "*");
filterContext.RequestContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Methods", "*");
filterContext.RequestContext.HttpContext.Response.AppendHeader("Access-Control-Allow-Headers", "*");

base.OnActionExecuting(filterContext);
}
}
}
[/code]

Después, basta con decorar las acciones del controlador, o incluso el controlador en sí, con este atributo para que comience a permitir llamadas desde javascript.

[code lang=”csharp”]
[AllowCrossSiteJson]
public abstract class APIController : System.Web.Mvc.Controller
{ …
[/code]

Ejemplo javascript

Si tienes un servicio web montado (o alojas un json en un servidor) puedes ver un ejemplo de código cliente (javascript) que permite llamadas CORS en github.

https://github.com/findemor/js-get-json-example

Acerca de findemor

Técnico de Innovación en solusoft.

Warning: count(): Parameter must be an array or an object that implements Countable in /homepages/30/d298707731/htdocs/porexpertos.es/wp-includes/class-wp-comment-query.php on line 405

Deja un comentario

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