ASP .NET - Como controlar os visitantes do seu site (C#)


Após você publicar o seu site ASP .NET na web você vai querer saber quem são os visitantes do site. Uma forma de fazer isso é consultar o o seu log de eventos no seu servidor host. Outra é você mesmo criar um código que faça este serviço registrando o que lhe interessa saber.

Em geral você vai querer obter o endereço IP e o nome DNS do visitante e também saber qual página que foi acessada. Então vejamos como podemos fazer isso usando a linguagem C# em uma aplicação ASP .NET.

O DNS (Domain Name System - Sistema de Nomes de Domínios) é um sistema de gerenciamento de nomes hierárquico e distribuído operando segundo duas definições:
  • Examinar e atualizar seu banco de dados.
  • Resolver nomes de domínios em endereços de rede (IPs).

O endereço IP, de forma genérica, é um endereço que indica o local de um nó em uma rede local ou pública.

Para um melhor uso dos endereços de equipamentos em rede pelas pessoas, utiliza-se a forma de endereços de domínio, tal como "www.macoratti.net". Cada endereço de domínio é convertido em um endereço IP pelo DNS.

Este processo de conversão é conhecido como "resolução de nomes".
fonte:
http://pt.wikipedia.org/wiki/Domain_Name_System

O objeto ServerVariables

Desde o tempo da Active Server Pages (ASP) podemos acessar o objeto chamado ServerVariables, que faz parte do objeto Request.

Principais funções do Objeto Request:

request.form - Obtêm valores de variáveis enviadas via formulário pelo método post.
request.QueryString - Recupera  valores de variáveis enviadas via formulário pelo método get.
request.servervariables - Recupera  informações sobre o browser do usuário e sobre o servidor WEB.
request.cookies - Obtêm informações do cookie do navegador do usuário
request.ClientCertificate - Exibe informações sobre o certificado de segurança do  usuário. Usado em sites com transmissão segura de dados (https)
 

Este objeto permite ao programador obter informações sobre muitas variáveis de ambiente. Você pode usar o ServerVariables juntamente com opções de segurança do diretório IIS(Internet Information Service) para determinar quem está acessando seu site. Você também pode pegar o endereço IP do visitante usando o objeto ServerVariables.

A coleção ServerVariables contém toda a informação gerada quando da requisição de um serviço pelo navegador combinada com as variáveis do ambiente do servidor.

Sintaxe: Request.ServerVariables(variavel)

Variavel : especifica o nome das variáveis do ambiente do servidor a retornar

Geralmente lemos estas informações para obter informações sobre o servidor ou sobre o navegador.

Os membros mais importantes da coleção ServerVariables são:

  1. Path_info – Armazena a informação do caminho da URL requisitada pelo navegador.(Não armazena a raiz do diretório do endereço URL.)
  2. CONTENT_LENGHT – permite determinar a extensão do conteúdo da solicitação HTTP do cliente usando o método POST.
  3. Query_String – Contém os parâmetros passados como parte de uma requisição a uma URL . (Tudo depois de um "? " é armazenado)
  4. SERVER_NAME – Fornece o nome do servidor contido na URL da página atual.
  5. HTTP_UA_COLOR – Indica o número de cores disponíveis na máquina do usuário.
  6. HTTP_UA_PIXELS – Contém a resolução da tela do navegador que fez a requisição.
  7. REMOTE _ADRR – O endereço IP do host remoto que esta solicitando o serviço.
  8. REMOTE _HOST – O nome do host que esta fazendo a solicitação do serviço.
  9. LOGON_USER - A conta no Windows NT no qual o usuário esta logado.
  10. HTTP_UA_OS – O nome e a versão do software servidor que está respondendo ao pedido.
  11. AUTH_TYPE - O método de autenticação que o servidor usa para validar usuários quando eles tentam acessar um script protegido.
  12. LOGON_USER - A conta no Windows NT do usuário.
  13. SERVER_PORT – O número da porta da qual a requisição foi enviada
  14. SERVER_PROTOCOL – O nome e a versão para o protocolo de informação.
  15. SERVER_SOFTWARE – O nome e a versão do software do servidor.
  16. SCRIPT_MAP – Informa a base da URL
  17. SCRIPT_NAME – Informa todo o caminho virtual para o roteiro presente.
  18. REQUEST_ADDR – Informa o endereço IP do host remoto que fez a requisição.
  19. REQUEST_METHOD – O método usado para fazer a requisição.(GET, POST, etc..)

A seguir temos um exemplo que exibe as variáveis do servidor da página : ASP 101 - Active Server Pages 101

LOCAL_ADDR 11.4.82.10 
PATH_INFO /samples/servvars.aspx 
PATH_TRANSLATED D:\Inetpub\WWWROOT\APSP01\ASP101\www\samples\servvars.aspx 
QUERY_STRING  
REMOTE_ADDR 192.44.5.243 
REMOTE_HOST 192.44.5.243 
REMOTE_PORT 41337 
REQUEST_METHOD GET 
SCRIPT_NAME /samples/servvars.aspx 
SERVER_NAME aspnet.asp101.com 
SERVER_PORT 80 
SERVER_PORT_SECURE
SERVER_PROTOCOL HTTP/1.0 
SERVER_SOFTWARE Microsoft-IIS/6.0 
URL /samples/servvars.aspx 
HTTP_CACHE_CONTROL max-age=259200 
HTTP_CONNECTION keep-alive 

Apenas para mostrar a você como usar estas variáveis vamos criar um projeto ASP .NET usando o Visual Web Developer 2010 Express Edition com o nome getVariaveis;

No menu File-> New Project selecione o template : Visual C# -> Web -> ASP .NET Empty Web Appliacation e informe o nome getVariaveis;

A seguir inclua uma nova página com o nome Default.aspx a partir do menu Project-> Add New Item escolhendo o template Web Form e informando Default.aspx;

A seguir inclua uma tabela na página Default.aspx com, via menu Table-> Insert Table, com 7 linhas e 2 colunas ;

Em seguida inclua 5 controles Buttons e 5 Labels na tabela conforme o leiaute da figura abaixo:

Finalmente inclua o código abaixo no arquivo code-behind Default.aspx.cs:

using System;

namespace getIP_Proxy
{
    public partial class Default : System.Web.UI.Page
    {
        protected void btnIP_1_Click(object sender, EventArgs e)
        {
            lblIP1.Text = getEnderecoIP();
        }
        protected void btn_IP2_Click(object sender, EventArgs e)
        {
            lblIP2.Text = getEnderecoIP();
        }

       protected string getEnderecoIP()
        {
            string strEnderecoIP; 
            strEnderecoIP =    Request.ServerVariables ["HTTP_X_FORWARDED_FOR"]; 
            if (strEnderecoIP == null) 
                strEnderecoIP = Request.ServerVariables["REMOTE_ADDR"]; 

            return strEnderecoIP;
        }

       protected void btnAll_Click(object sender, EventArgs e)
       {
           lblHttp.Text = Request.ServerVariables["ALL_RAW"];
       }

       protected void btnServidor_Click(object sender, EventArgs e)
       {
           lblServidor.Text = Request.ServerVariables["SERVER_NAME"]; 
       }
    }
}
Este código chama a função getEnderecoIP() para o evento Click
dos botões: bntIP1 e btnIP2 onde primeiro tentamos obter o endereço
IP usando a variável
HTTP_X_FORWARDED_FOR e se o valor for
nulo então usamos variável de ambiente
REMOTE_ADDR

1- Código para obter os cabeçalhos HTTP

Request.ServerVariables["ALL_RAW"];

2 - Código para obter o nome do servidor

Request.ServerVariables["SERVER_NAME"];

Para obter o endereço IP usando ASP .NET e a linguagem C# podemos usar :

Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ou Request.ServerVariables["REMOT_ADDR"]

Mas qual a diferença ???

Se você estiver fazendo uma conexão via um servidor Proxy o método Request.ServerVariables["REMOT_ADDR"] irá retornar somente o endereço IP do servidor proxy e não o IP real da máquina do cliente. Para obter o endereço IP real do cliente via servidor proxy devemos usar : Request.ServerVariables["HTTP_X_FORWARDED_FOR"]

Para obter o nome do DNS podemos usar :

Dns.GetHostEntry( string enderecoIP);

Onde estamos usando a classe Dns que fornece a funcionalidade de resolver um nome de domínio. O método GetHostEntry() retorna de forma assíncrona o endereço resolvido para o IP do host especificado;

Para obter o endereço da página requisitada podemos usar:

Request.Url.ToString();

O objeto Request permite obter informações sobre a URL da requisição atual.

Os objetos Response e Request ainda existem e podem usados em páginas ASP.NET. Estes objetos representam a informação chegando no servidor Web a partir do navegador(Request) e a informação saindo do servidor para o navegador(Response).

O objeto Request representa o objeto input e o objeto Response representa o objeto output.

Principais propriedades de Request:

Body: Obtêm/Defube o corpo do request HTTP
CodePage: Obtêm/Define o código da página para o corpo request.
Headers
: Obtêm a coleção de cabeçalho HTTP 
HTTPVersion
: Obtêm/Define a versão HTTP
Path
: Obtêm/Define o caminho HTTP
ResponseBufferSize: Obtêm/Define o tamanho do buffer usado para armazenar o corpo response.
Verb: Obtêm/Define o método verb HTTP

Após obter as informações basta gravá-las em um arquivo de log para consulta.

Abaixo temos um exemplo bem simples de como fazer isso onde incluímos no evento Load da página o código para obter as informações do visitante.

Obs: Uma outra opção seria usar o evento Application.BeginRequest do arquivo Global.asax

 protected void Page_Load(object sender, EventArgs e)
  {
            string enderecoIP = getEnderecoIP();
            string nomeHost = Dns.GetHostEntry(enderecoIP).HostName;

            StreamWriter wrtr = new StreamWriter(Server.MapPath("visitantes.log"), true);
            wrtr.WriteLine(DateTime.Now.ToString() + " | " + enderecoIP + " | " + nomeHost + " | " + Request.Url.ToString());
            wrtr.Close();
 }

O código acima necessita dos namespace System.IO e System.Net pois estamos usando a classe StreamWriter para criar um arquivo e a classe Dns para obter o DNS.

No código acima estamos criando um arquivo texto chamado visitantes.log na raíz da aplicação e logando as informações de data, endereço ip, nome do host e página requisitada.

Após executarmos o projeto web obtemos o seguinte resultado verificando o arquivo visitantes.log que foi gravado no raiz da aplicação:

Pegue o projeto completo aqui: VariaveisServidor.zip

"O que era desde o princípio, o que ouvimos, o que vimos com os nossos olhos, o que contemplamos e as nossas mãos apalparam, a respeito do Verbo da vida(pois a vida foi manifestada, e nós a temos visto, e dela testificamos, e vos anunciamos a vida eterna, que estava com o Pai, e a nós foi manifestada);" 1 João 1:1-2

Referências:


José Carlos Macoratti