Resolvendo o problema de Cross-Domain no Asp.Net WebApi

Olá pessoa!

Aqui vai uma dica rápida mas que ajuda bastante quem está desenvolvendo Api’s com o Asp.Net WebApi.

O Cross-Domain é o bloqueio de transações entre domínios diferentes, isto é, caso você crie uma api e hospede no ServidorA por exemplo, quando um determinado ServidorB for acessar via Ajax, pode receber a seguinte mensagem:

XMLHttpRequest cannot load http://servidos/api/metodo. Origin null is not allowed by Access-Control-Allow-Origin.

Basicamente, o que temos que fazer é informar no Header que está permitido o acesso proveniente de outro domínio: Access-Control-Allow-Origin.

Para isso, vamos criar um ActionFilter.

Um ActionFilter é uma forma de interceptar uma Action em um determinado Controller disparando eventos antes ou depois de sua execução.

Saiba mais aqui.

    public class EnableCrossDomainAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        const string Origin = "Origin";
        const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";

        public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Request.Headers.Contains(Origin))
            {
                string originHeader = actionExecutedContext.Request.Headers.GetValues(Origin).FirstOrDefault();
                if (!string.IsNullOrEmpty(originHeader))
                {
                    actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeader);
                }
            }
        }
    }

Essa classe pode ser salva no lugar que você achar conveniente. Geralmente eu crio uma pasta chamada Filters para esse tipo de classe.

Agora, basta adicionar esse filtro na classe ou no método que você quiser liberar o Cross-Domain.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace WebApiOData.Controllers
{
    [EnableCrossDomain]
    public class BandasController : ApiController
    {
        [HttpGet]
        public IQueryable<Models.Banda> Listar()
        {
            Models.Repositorio repositorio = new Models.Repositorio();
            var bandas = repositorio.Listar();

            return bandas;
        }
    }
}

O Controller acima foi tirado do post onde eu falo sobre Asp.Net WebApi e OData. Veja!!

Agora é só testar!!

Resolveu??

É nóis!!

Muito Obrigado e até a próxima.

Angelo Belchior

Trilha Sonora do Post:

Peter Frampton : Breaking All The Rules

About these ads

Um comentário sobre “Resolvendo o problema de Cross-Domain no Asp.Net WebApi

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s