Olá amigos. Na parte A deste artigo vou mostrar como criar um log de acesso para o seu site, salvando as informações em um XML.
Na Parte B, vou exibir um relatório com gráfico utilizando MS-SilverLight. Gostaria de ressaltar que relatório não necessariamente precisa ser exibido utilizando a tecnologia Silverlight.
Imagem de exemplo do Gráfico gerado com o SilverLight.Imagem de exemplo do Gráfico gerado com o SilverLight.
O IHttpModule
O IHttpModule é o módulo Http chamado sempre que houver uma requisição em seu sistema Web. O IHttpModule é geralmente utilizado para implementar uma camada de Segurança, Log de acesso ou cabeçalhos/rodapés personalizados.
Pré-requisitos (Parte A)
Este artigo foi montado nas configurações abaixo. Não foi testado em outros ambientes. Para criar o sistema de log:
- Framework ASP.NET 2.0 com VB.net
- Visual Studio 2005.
Mãos à obra
Crie uma novo site web no Visual Studio e, em seguida, crie a pasta App_Code.
Crie agora dois arquivos “Class” em VB, chamado logModule.vb. e outro “log.vc”
Apenas como guia, segue um printscreen da estrutura de diretórios deste projeto:

Classe de Log
Esta classe terá as propriedades e métodos necessários para salvar um log que acesso do seu usuário. Criamos parâmetros que recebem as informações de acesso do usuário, como Data, IP do usuário, Browser que ele utilizou para acessar a página, entre outras.
Primeiro vamos adicionar as propriedades
Imports Microsoft.VisualBasic
Public Class log
#Region "Propriedades"
''' <summary>
''' Retorna a data atual
''' </summary>
''' <remarks></remarks>
Private m_dData As DateTime
Public Property Data() As DateTime
Get
Return m_dData
End Get
Set(ByVal value As DateTime)
m_dData = value
End Set
End Property
''' <summary>
''' Retorna o IP do usuário
''' </summary>
''' <remarks></remarks>
Private m_IP As String
Public Property IP() As String
Get
Return m_IP
End Get
Set(ByVal value As String)
m_IP = value
End Set
End Property
''' <summary>
''' URL da Página
''' </summary>
''' <remarks></remarks>
Private m_sURL As String
Public Property URL() As String
Get
Return m_sURL
End Get
Set(ByVal value As String)
m_sURL = value
End Set
End Property
''' <summary>
''' Query String da Página
''' </summary>
''' <remarks></remarks>
Private m_sQuery As String
Public Property Query() As String
Get
Return m_sQuery
End Get
Set(ByVal value As String)
m_sQuery = value
End Set
End Property
''' <summary>
''' Browser que o usuário está usando
''' </summary>
''' <remarks></remarks>
Private m_sBrowser As String
Public Property Browser() As String
Get
Return m_sBrowser
End Get
Set(ByVal value As String)
m_sBrowser = value
End Set
End Property
''' <summary>
''' De onde o visitante veio para a página
''' </summary>
''' <remarks></remarks>
Private m_sURLAnterior As String
Public Property UrlAnteriol() As String
Get
Return m_sURLAnterior
End Get
Set(ByVal value As String)
m_sURLAnterior = value
End Set
End Property
#End Region
Em Seguida, vamos criar o método salvarLog() que será responsável em salvar 0 nosso log de acesso em um arquivo .XML.
#Region "Salvar"
''' <summary>
''' Salva o log em um .xml
''' </summary>
''' <param name="sCaminhoCompleto">
''' Caminho completo do arquivo de log.
''' </param>
''' <remarks>
''' Pode ser implementado para salvar em um banco de dados.
''' </remarks>
Public Sub salvarLog(ByVal sCaminhoCompleto As String)
If System.IO.File.Exists(sCaminhoCompleto) Then
' Exemplo didático de como criar uma estrutura de tabela
Dim dt As New Data.DataTable
dt.TableName = "Log"
dt.Columns.Add("Data")
dt.Columns.Add("IP")
dt.Columns.Add("URL")
dt.Columns.Add("Query")
dt.Columns.Add("Browser")
dt.Columns.Add("URLAnterior")
' Leio o XML
dt.ReadXml(sCaminhoCompleto)
' Crio uma nova linha
Dim dr As System.Data.DataRow = dt.NewRow
' Atribuo os valores para a linha
dr("Data") = m_dData.ToString("dd/MM/yyyy HH:mm:ss")
dr("IP") = m_IP
dr("URL") = m_sURL
dr("Query") = m_sQuery
dr("Browser") = m_sBrowser
dr("URLAnterior") = m_sURLAnterior
' Adiciono a linha para a tabela
dt.Rows.Add(dr)
' Salvo o arquivo
dt.WriteXml(sCaminhoCompleto)
End If
End Sub
#End Region
End ClassImplementando o IHttpModule
Abra agora o seu arquivo “logModule.vb”
Vamos marcar que estamos implementando o módulo IHttpModule.
Public Class logModule
Implements System.Web.IHttpModule
Após digitarmos “Implements IHttpModule” e apertarmos “enter” será automaticamente criado no Visual Studio 2005 os métodos Init e Dispose.
Recebendo as informações de acesso
No método abaixo, vamos receber as informações do acesso do usuário como Browser, Página, IP, de onde ele veio e Data. Para isto, vamos instanciar a classe log do arquivo que acabamos de criar no arquivo log.vb, e chamar o método salvar.
''' <summary>
''' Sub que salva o log que é chamado no load de cada request.
''' </summary>
''' <remarks></remarks>
Private Sub salvarLog(ByVal sender As Object, ByVal e As EventArgs)
Dim oLog As New log
oLog.Data = Date.Now
oLog.IP = System.Web.HttpContext.Current.Request.UserHostAddress.ToString
oLog.Browser = System.Web.HttpContext.Current.Request.UserAgent.ToString
oLog.Query = System.Web.HttpContext.Current.Request.QueryString.ToString
oLog.URL = System.Web.HttpContext.Current.Request.Url.ToString
' Se o usuário acessou direto a página, não tem referrer
Try
oLog.UrlAnteriol = System.Web.HttpContext.Current.Request.UrlReferrer.ToString
Catch ex As Exception
oLog.UrlAnteriol = "Acesso Direto"
End Try
' Eu não quero salvar o log para a tela de relatório
If InStr(LCase(oLog.URL), "relatorio.aspx") = 0 And InStr(LCase(oLog.URL), "RelatorioSilverLight") = 0 Then
oLog.salvarLog(sCaminhoArquivoLog & sArquivoLog)
End If
End SubValidando se o arquivo XML Existe
Por segurança, vamos validar se o arquivo XML existe. Caso o arquivo não exista, vamos lavantar um erro. O Caminho deve ser configurado corretamente no seu web.config.
''' <summary>
''' Verifica se o arquivo existe
''' </summary>
''' <remarks></remarks>
Private Sub ValidarArquivo(ByVal sender As Object, ByVal e As EventArgs)
If Not System.IO.File.Exists(sCaminhoArquivoLog & sArquivoLog) Then
Throw New Exception("Configure o arquivo de log corretamente em " & sCaminhoArquivoLog & sArquivoLog & ". O arquivo exemplo está na raíz deste projeto.")
End If
End SubInicialização
Métodos de inicialização do logModule. No load vamos chamar a nossa verificação de arquivo, e o método de salvar o arquivo. Note que também criamos duas variáveis para receber as configurações de caminho do nosso arquivo de log.
Private sCaminhoArquivoLog As String = System.Configuration.ConfigurationManager.AppSettings("CaminhoArquivoLog").ToString
Private sArquivoLog As String = System.Configuration.ConfigurationManager.AppSettings("ArquivoLog").ToString
#Region "Load"
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.PostRequestHandlerExecute, AddressOf ValidarArquivo
AddHandler context.PostRequestHandlerExecute, AddressOf salvarLog
End Sub
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
End Sub
#End Region Configurando o web.config
Após as nossas duas classes estarem prontas, temos que configurar o web.config para que ele possa chamar o nosso log sempre que houver uma requisição http.
Na tag “Configuration” ? appSettings devemos criar a nossa configuração.
<appSettings>
<!-- Informe corretamente o caminho do seu XML-->
<add key="CaminhoArquivoLog" value="c:/"/>
<!-- Informe corretamente o nome do seu Arquivo XML-->
<add key="ArquivoLog" value="log.xml"/>
</appSettings>
Em seguida devemos configurar o HttpModule, para a nossa clase de Log
<!-- Configura o httpModule, conforme abaixo-->
<httpModules>
<add name="logModule" type="logModule"/>
</httpModules>Testando nosso log
Para testar nosso log, crie a quantidade de páginas que você quiser. Conforme for navegando por elas, os valores serão preenchidos no log.
Considerações finais
Finalizamos a Parte A deste artigo. Na parte B vamos mostrar o relatório em um gráfico utilizando o Silverlight.
Clique aqui para dar download no projeto de exemplo.
Forte Abraço.







