Localização de Usuário: Obter Cidade e Estado pelo IP em ASP.NET

A um certo tempo atrás isso era um pouco complicado de ser feito ou ficávamos dependentes (muito) de ferramentas de terceiros. Hoje, claramente, posso afirmar que temos mais flexibilidade porém continuamos atrelados. Mas não seja por isso! A Google disponibilizou uma API inovadora que nos ajuda nesse caso e em muitos outros (relativo ao GoogleMaps). O GoogleMaps.Subgurim.NET é um avançado controle do GoogleMaps para o ASP.NET e permite uma gama de manipulações sobre suas funcionalidades e a que iremos demonstrar aqui é a de obter informações do usuário pelo IP (no site deles pode encontrar bem como códigos avançados e demais exemplos). Em contrapartida, é preciso de um arquivo extra contendo faixas de IP distribuídas pelo mundo. Então a MaxMind disponibilizou também um arquivo binário contendo essas informações gratuitamente. Você pode obter o arquivo aqui ou aqui (a diferença é que um é o link direto e o outro é a página geral que pode-se obter em outros formatos). Esse arquivo é mensalmente atualizando inserindo novas faixas, logo, deixo o dica para dar sempre uma atualizada quando possível (com isso aumenta mais a precisão mas hoje, com esse arquivo, já realiza uma boa cobertura).
Para início dos trabalhos, baixe o componente GoogleMaps.Subgurim.NET e o arquivo de faixas GeoLiteCity.dat. Crie um novo Web Site. Adicione a GMaps.dll na pasta Bin do projeto e copie o GeoLiteCity.dat também (coloque em outra pasta afim de organizá-los - no meu caso coloquei em uma pasta chamada Data). Agora escreva o seguinte código abaixo:

using Subgurim.Controles;

private void ObtemInfoUser()
{
    string database = Server.MapPath("~/Data/GeoLiteCity.dat");
    LookupService servico = new LookupService(database);
    Location localizacao = servico.getLocation(Request.ServerVariables["REMOTE_ADDR"]);
    if (localizacao != null)
    {
        Response.Write("Cidade: " + localizacao.city + "<br />");
        Response.Write("País: " + localizacao.countryName + "<br />");
        Response.Write("Código do País: " + localizacao.countryCode + "<br />");
        Response.Write("Região: " + localizacao.region + "<br />");
        Response.Write("Código da Área: " + localizacao.area_code + "<br />");
        Response.Write("Latitude: " + localizacao.latitude + "<br />");
        Response.Write("Longitudade: " + localizacao.longitude);
    }
}
 
Você deve obter a saída algo do tipo:
 
Cidade: Salvador
País: Brazil
Código do País: BR
Região: 5
Código da Área: 0
Latitude: -12,7636
Longitude: -15,2821
 
* Obs: a latitude e longitude são dados fictícios que eu coloquei ;)
 
Se você estiver testando localmente, não terá resultado pois o Request.ServerVariables["REMOTE_ADDR"] irá trazer o valor 127.0.0.1. Para saber seu IP externo acesse o MeuIp e substitua-o para visualizar os valores e validá-los. Em breve estarei escrevendo outros artigos mostrando como aproveitar bem a API do GoogleMaps bem como demais funcionalidades. Até mais!

UPDATE: Após ler, vejam aqui sobre o plágio que fizeram com meu artigo e depois acusaram que eu que copiei. Quem lê o blog sabe como eu escrevo e como expresso minhas idéias...