Marcelo Ramos

Desenvolvimento em .NET, Banco de Dados e Tecnologia em Geral

Implementando Log de Acessos usando Herança com ASP.NET e C#

Além do site estar bonito e funcional, é muito importante que saibamos o quanto ele está sendo acessado.
O intuito desse Post é mostrar como fazer um log de acessos bem simples, e de forma bem rápida, usando Herança.

1° Passo : Criar a tabela que gravará os dados de acesso

Vamos chamá-la de LOG_ACESSOS e armazenar a DATA e alguns campos retornados pela coleção Request.ServerVariables.

A coleção ServerVariables contém informações do cliente e do servidor. Estas variáveis são criadas quando uma nova página é requisitada.
O uso das ServerVariables é bem útil caso necessitemos de informações do servidor ou do navegador do cliente.
E são esses dados que iremos gravar em nosso Log.

As variáveis da coleção você confere na lista abaixo :


ALL_HTTP - Lista informações tais como: host origem, página de origem, caracteristicas do navegador cliente, entre outras.
ALL_RAW
- Retorna todas as informações enviadas por cabeçalho HTTP da página em seu estado original.
APPL_MD_PATH
- Devolve o caminho lógico da página (path do metabase).
APPL_PHYSICAL_PATH
- Caminho físico do arquivo no disco.
AUTH_TYPE
- Método de autenticação utilizado pelo servidor para validar usuários que solicitam um script.
AUTH_USER
- Nome de usuário fornecido ao servidor em caso de não permitir acesso anônimo ao diretório.
AUTH_PASSWORD
- Senha referente ao usuário logado.
CERT_COOKIE - ID
do certificado digital do cliente.
CERT_FLAGS
- Valor de dois bits: bit 0 igual a 1 indica se o certificado do cliente está presente, bit 1 igual a 1,
indica que a autoridade de certificação do certificado do cliente é inválida.
CERT_ISSUER
- Campo Issuer do certificado do cliente (O=MS, OU=IAS, CN=usuário, C=USA).
CERT_KEYSIZE
- Número de bits na chave de conexão SSL.
CERT_SECRETKEYSIZE
- Número de bits na chave do "Server certificate private"
CERT_SERIALNUMBER
- Campo Serial Number do certificado digital do cliente.
CERT_SERVER_ISSUER
- Campo Issuer do certificado do servidor.
CERT_SERVER_SUBJECT
- Campo Subject do certificado SSL do servidor.
CERT_SUBJECT
- Campo Subject do certificado do cliente.
CONTENT_LENGTH
- Tamanho em bytes, do conteúdo de uma requisição request ao servidor.
CONTENT_TYPE
- Tipo de requisição enviada ao servidor pelo cliente.
GATEWAY_INTERFACE
- Tipo de interface CGI usada no servidor web para manipular a solicitação (request).
HTTP_NOMEHEADER
- Valor armazenado no header especificado. Podemos destacar os mais comuns: HTTP_ACCEPT, HTTP_ACCEPT_ENCODING
HTTPS
- Retorna à uma solicitação request, dizendo se o canal é seguro (ON) ou não seguro (OFF).
HTTPS_KEYSIZE
- Número de bits na chave de conexão Secure Sockets Layer - SSL.
HTTPS_SECRETKEYSIZE
- Número de bits na chaver do "server certificate private".
HTTPS_SERVER_ISSUER
- Campo Issuer do certificado do servidor.
HTTPS_SERVER_SUBJECT
- Campo subject do certificado do servidor.
INSTANCE_ID
- ID, em formato texto, para a instância do Internet Information Server (IIS).
INSTANCE_META_PATH - Path do metabase para a instância do Internet Information Server (IIS) que responde à solicitação (request).
LOCAL_ADDR
- Retorna o endereço lógico do servidor onde foi feito a requisição
LOGON_USER
- Conta do usuário usada para efetuar o logon no Windows.
PATH_INFO
- Caminho virtual do arquivo que realizou a requisição, apartir da raiz do servidor.
PATH_TRANSLATED
- Versão da variável "PATH_INFO" transformado em path físico.
QUERY_STRING
- Retorna as variáveis passadas por cabeçalho HTTP à uma página via QueryString.
REMOTE_ADDR
- Retorna endereço IP da máquina cliente que requisitou algo ao servidor.
REMOTE_HOST
- Nome do host que requisitou algo ao servidor.
REMOTE_USER
- Nome da máquina que solicitou o arquivo asp ao servidor. Disponível somente se disponível.
REQUEST_METHOD
- Método usado pela requisição ao servidor (GET ou POST)
SCRIPT_NAME
- Path virtual do arquivo requisitado ao servidor.
SERVER_NAME
- Nome do servidor onde foi realizada a requisição (pode ser retornado o endereço IP, DNS alias ou nome do host).
SERVER_PORT
- Retorna o número da porta onde foi realizada a requisição ao servidor.
SERVER_PORT_SECURE
- Diz se a porta onde é recebida as solicitações pelo servidor é segura (1) ou não segura (0).
SERVER_PROTOCOL - Retorna nome e versão respectivamente do protocolo usado pelo servidor WEB para interpretar a solicitação


Para fins didáticos, vamos escolher apenas algumas dessas variáveis em nossa tabela e além disso armazenar um ID como chave e a DATA da inserção

dos dados

CREATE
TABLE DBO.LOG_ACESSOS
(
       ID                  INT IDENTITY(1,1) NOT NULL,
       DATA                DATETIME NOT NULL,
       QUERY_STRING        VARCHAR(MAX) NULL,
       REMOTE_ADDR         VARCHAR(MAX) NULL,
       REMOTE_HOST         VARCHAR(MAX) NULL,
       LOGON_USER          VARCHAR(MAX) NULL
)
GO

ALTER
TABLE DBO.LOG_ACESSOS ADD CONSTRAINT [PK_LOG_ACESSOS] PRIMARY KEY (ID)
GO

Com nossa tabela criada, faremos uma procedure de INSERT.

CREATE PROCEDURE DBO.INSERT_LOG_ACESSOS
(
       @QUERY_STRING VARCHAR(MAX) = NULL,
       @REMOTE_ADDR  VARCHAR(MAX) = NULL,
       @REMOTE_HOST  VARCHAR(MAX) = NULL,
       @LOGON_USER   VARCHAR(MAX) = NULL
)
AS
BEGIN
      
INSERT INTO DBO.LOG_ACESSOS      
(      
DATA               
,      
QUERY_STRING
,      
REMOTE_ADDR        
,      
REMOTE_HOST        
,      
LOGON_USER                       
)      
VALUES      
(      
GETDATE()           ,      
@QUERY_STRING
,      
@REMOTE_ADDR
,      
@REMOTE_HOST
,      
@LOGON_USER               
)
END

2º Passo :  Criar uma classe LogAcessos com um método que executa nossa procedure de INSERT.

public class LogAcessos   
{       

// Pega String de Conexão do Web.Config       
private readonly string ConnectionString
= System.Web.Configuration.
WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;        

// Construtor Padrão
       
public LogAcessos()       
{ }        

// Metodo que Grava os Acessos       
public void GravaAcesso()       
{           
using (SqlConnection conexao = new SqlConnection(this.ConnectionString))           
{               
SqlCommand comando = new SqlCommand();                
comando.Connection = conexao;               
comando.CommandType = System.Data.
CommandType.StoredProcedure;               
comando.CommandText =
"INSERT_LOG_ACESSOS"               

comando.Parameters.AddWithValue("@QUERY_STRING",
HttpContext.Current.Request.ServerVariables["QUERY_STRING"].ToString() );               

comando.Parameters.AddWithValue(
"@REMOTE_ADDR",
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString() );               

comando.Parameters.AddWithValue(
"@REMOTE_HOST",
HttpContext.Current.Request.ServerVariables["REMOTE_HOST"].ToString() );               

comando.Parameters.AddWithValue(
"@LOGON_USER",
HttpContext.Current.Request.ServerVariables["LOGON_USER"].ToString() );               

try {                   
conexao.Open();                   
int i = comando.ExecuteNonQuery();                   
comando.Dispose();               
}               
catch (SqlException sql)               
{                    
// trata Exception SQL               
}               
catch (Exception ex)               
{                   
// trata Exception Genérica               
}               
finally {                   
if (conexao.State == System.Data.ConnectionState.Open)                   
{                       
conexao.Close();                   
}               
}           
}       
}   
}


3º Passo : Criar classe herdando de System.UI.Page, sobrescrever o OnLoad,
instanciar nossa classe LogAcessos e executar o método GravaAcesso()
 

public class BaseForm : System.Web.UI.Page   
{       
protected override void OnLoad(EventArgs e)       
{           
LogAcessos log = new LogAcessos();           
log.GravaAcesso();           
log =
null;            
base.OnLoad(e);       
}   
}


4º Passo : Ao criar as páginas, fazer com que herdem da nossa classe BaseForm

public partial class _Default : BaseForm    
{       
protected void Page_Load(object sender, EventArgs e)       
{                   
}   
}


Dessa forma, sempre que suas páginas carregarem, elas executarão o método
GravaAcesso, gravando na nossa tabela LOG_ACESSOS os dados que definimos


Espero que seja útil
[]s


Classe SqlConnection

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx

Classe SqlCommand
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

Request.ServerVariables Collection
http://msdn.microsoft.com/en-us/library/ms525396.aspx

Inheritance (C# Programming Guide)
http://msdn.microsoft.com/en-us/library/ms173149.aspx

Posted: jun 09 2009, 22:42 by marcelo | Comentários (8) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: ASP.NET | C# | SQL

Comentários

Comentar


(Vai mostrar seu Gravatar)  

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading