Liberando o WebAPI para o acesso do AngularJS

Olá pessoal, hoje eu vou falar um pouco sobre uma experiência que passei esses dias com WebAPI e o AngularJS. O que eu gostaria de fazer é deixar o AngularJS acessar o meu WebAPI (Web Service) não imporando onde estava o meu serviço e onde estava o meu AngularJS.

Como você já deve saber, o AngularJS basicamente é JavaScript e a execução dele é feita pelo browser. Quando você desenvolve um serviço, é necessário se preocupar com a segurança via token, acesso ao serviço, senha, mas também com a liberação de acesso direto por um JavaScript e endereço do servidor.

Quando você está no mesmo domínio, o acesso funciona perfeitamente, pois o serviço sabe quando o requisitou, mas quando você fala de outro domínio como por exemplo um localhost para um endereço www, o acesso será bloqueado e uma mensagem no AngularJS será mostrada.

A mensagem retornada para o seu JavaScript será No Access Control Allow Origin ou o famoso CORS muito falado na Internet. Para liberar o acesso, é necessário mexer na configuração do arquivo WebApiConfig.cs dentro do seu projeto.

Como a Microsoft trabalha bem e sabe desses possíveis problemas, ela desenvolveu um plugin que já cuida disso pra gente e eu vou mostrar como ele funciona.

O primeiro passo é acessar o NuGet pela ferramenta Visual Studio e procurar pelo nome Microsoft.AspNet.Cors. Veja a figura 1.1.

Image

Figura 1.1 - Acessando o NutGet.

Instale o plugin dentro do seu projeto WebAPI e depois acesse a pasta App_Start/WebApiConfig.cs.

Normalmente, o acesso é liberado de um determinado domínio para acesso, não é aconselhável liberar para todo mundo, isso porque fogue um pouco da segurança.

Dentro do método Register(HttpConfiguration config) coloque o seguinte código. Código 1.1.

Código 1.1 - Configurando acesso

using System.Web.Http;
using System.Web.Http.Cors;

public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*",
            "*");
        config.EnableCors(cors);

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

Para fazer logo o teste de localhost eu descidi liberar todo o acesso no WebAPI, depois de fazer o teste eu fecho para um endereço específico.

As duas linhas de código que libera todo o acesso está logo no início, primeira parte do código. Veja o código 1.2.

Código 1.2 - Liberando acesso

using System.Web.Http;
using System.Web.Http.Cors;

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Você pode liberar por método, pode liberar por requisição, pode liberar por cabeçalho e muito mais. O primeiro asterisco pode ser colocado endereço de origem do acesso, depois o header e depois o método.

Como eu quis liberar tudo para testar coloquei o asterisco e coloquei para habilitar o CORS com o método EnableCors.

Fica bem simples fazer assim. Depois disso basta usar o seu JavaScript para acessar e tudo funciona.

Espero que tenha ajudado e qualquer dúvida pode entrar em contato pelo site www.mauriciojunior.org.