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