TuttoPC.Info
  Home  |  Hardware  |  Tips & Tricks  |  Reti & Sicurezza  |  E-Commerce  |  Tecnologie Web  |  Connessioni Internet/EMail  |  Glossario  |  Marketing e Web Marketing  |  Script e moduli per ASP.NET
   Sei in:  
Home \ Knowledge Base \ 
Sommario
Hardware
Tips & Tricks
Reti & Sicurezza
E-Commerce
Tecnologie Web
Connessioni Internet/EMail
Glossario
Marketing e Web Marketing
Script e moduli per ASP.NET
Registrazione File Hosting BETA
Login File Hosting BETA
Verifica configurazione DNS
Utility varie
Nuovo Blog
Ricerca nel sito
Segnala il sito a un amico
Se hai trovato questa pagina interessante, scrivilo ad un amico, clicca qui
NEW!! GiDiNet Web Directory
GiDiNet Directory è una Web Directory divisa in più aree tematiche in cui potrete trovare comodamente siti che trattano argomenti di vostro interesse, continua...
Statistiche
Oggi 25/04/2024
sei il visitatore n.
per un totale di visitatori dal 23/04/2007
Hai un problema particolare? Non trovi quello che stai cercando? clicca qui!
Intercettare gli errori e segnalarli automaticamente al webmaster - ASP.NET 2.0
Lo script pubblicato in questa pagina, è un'esempio sull'uso degli httphandler e serve per intercettare gli errori generati da pagine aspx e notificarli automaticamente via e-mail al responsabile del sito.

Questo tipo di soluzione può essere un'alternativa all'uso del file global.asax, per poter gestire in modo differente gli errori.

Le richieste vengono gestite con un apposito http handler, che può notificare gli errori avvenuti sia in fase di compilazione sia in fase di esecuzione.

Questa soluzione è utile per tenere traccia di tutti gli errori che si sono verificati sul sito per poi risolverli, senza doversi affidare esclusivamente alle segnalazioni dei visitatori.

Oltre a questo, si potrà poi lasciare disattivata la visualizzazione dei messaggi di errori completi sul browser, evitando cosi' il rischio di rendere note informazioni sulla propria applicazione web al pubblico.

1. Installazione dello script

Per l'installazione dello script è sufficiente creare due file /App_Code/NotifyErrorHandler.vb e /Web.config secondo quanto indicato di seguito
Se il file /Web.config fosse già presente sullo spazio web, basterà modificarlo inserendo quanto riportato in grassetto nelle sezioni indicate.
Scarica i sorgenti completi


Codice del file /App_Code/NotifyErrorHandler.vb:
'Copyright (C) 2007 Daniele Iunco

'This program is free software; you can redistribute it and/or modify
'it under the terms of the GNU General Public License as published by
'the Free Software Foundation; either version 2 of the License, or
'(at your option) any later version.

'This program is distributed in the hope that it will be useful,
'but WITHOUT ANY WARRANTY; without even the implied warranty of
'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'GNU General Public License for more details.

'You should have received a copy of the GNU General Public License along
'with this program; if not, write to the Free Software Foundation, Inc.,
'51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Imports System
Imports System.Web

Namespace GiDiNet

    'NotifyErrorHandler v1.0
    'Author: Daniele Iunco
    'Date: 8th May 2007

    'ATTENZIONE: utilizzando questo modulo per qualsiasi file aspx (*.aspx) non sarà possibile utilizzare altri httphandler
    Public Class NotifyErrorHandler
        Inherits UI.PageHandlerFactory
        Implements IHttpHandlerFactory, SessionState.IRequiresSessionState

        'Inserire il percorso della pagina di errore, la pagina deve essere un file .aspx
        Const ErrorPagePath As String = "/errorpage.aspx"

        Public Overrides Function GetHandler(ByVal context As HttpContext, ByVal requestType As String, ByVal virtualPath As String, ByVal path As String) As IHttpHandler
            'Questa parte del modulo praticamente intercetta gli errori in fase di compilazione
            Try
                Dim myHttpHandler As IHttpHandler = MyBase.GetHandler(context, requestType, virtualPath, path)
                Return New myCustomHttpHandler(virtualPath, ErrorPagePath, myHttpHandler)
            Catch ex As Exception
                NotifyErrorToAdmin(ex.Message & vbCrLf & ex.StackTrace)
                Return MyBase.GetHandler(context, requestType, ErrorPagePath, context.Request.MapPath(ErrorPagePath))
            End Try
        End Function

        Public Shared Sub NotifyErrorToAdmin(ByVal ErrorText As String)
            'Modificare le righe seguenti per inserire gli indirizzi e-mail corretti e personalizzare il messaggio di errore
            Dim myMail As New Net.Mail.MailMessage()
            With myMail
                .From = New Net.Mail.MailAddress("from@domain.com") 'Mittente
                .To.Add(New Net.Mail.MailAddress("to@domain.com")) 'Destinatario
                .Subject = "Errore nell'esecuzione della pagina"
                .IsBodyHtml = False
                .Body = "Si è verificato il seguente errore: " & vbCrLf & ErrorText
            End With
            Dim myClient As New Net.Mail.SmtpClient()
            myClient.Send(myMail)
        End Sub

    End Class

    Public Class myCustomHttpHandler
        Implements IHttpHandler, SessionState.IRequiresSessionState
        Private _objHandler As IHttpHandler
        Private _url As String
        Private _errorPage As String

        Public Sub New(ByVal url As String, ByVal errorPage As String, ByVal objHandler As IHttpHandler)
            _objHandler = objHandler
            _url = url
            _errorPage = errorPage
        End Sub

        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return _objHandler.IsReusable
            End Get
        End Property

        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
            'Questa parte del modulo intercetta gli errori generati in fase di esecuzione
            Try
                _objHandler.ProcessRequest(context)
            Catch ex2 As Threading.ThreadAbortException
                'Questa eccezione generalmente è voluta (Uso di Response.Redirect, interruzione del thread da script, etc)
                Exit Sub
            Catch ex As Exception
                NotifyErrorHandler.NotifyErrorToAdmin(TraceException(context, ex))
                Dim _ErrorHandler As IHttpHandler = UI.PageParser.GetCompiledPageInstance(_errorPage, context.Request.MapPath("/errorpage.aspx"), context)
                _ErrorHandler.ProcessRequest(context)
            End Try
        End Sub

        Private Function TraceException(ByRef context As HttpContext, ByVal exOriginal As Exception) As String
            'questa procedura restituisce una stringa contenente delle informazioni sull'eccezione
            'è possibile modificare quanto riportato di seguito per inserire ulteriori dettagli 
            Dim dNow As Date = Now

            Dim sResult As String = "" & _
            "Data/ora: " & dNow.ToShortDateString & " " & dNow.ToLongTimeString & vbCrLf & _
            "" & vbCrLf & _
            "ApplicationPath: " & context.Request.ApplicationPath & vbCrLf & _
            "" & vbCrLf

            If context.Request.QueryString.Count > 0 Then
                sResult &= "URL: " & _url & "?" & context.Request.QueryString.ToString & vbCrLf
            Else
                sResult &= "URL: " & _url & vbCrLf
            End If

            sResult &= "Request path: " & context.Request.Path & vbCrLf & _
               "Remote address: " & context.Request.ServerVariables("REMOTE_ADDR") & vbCrLf & _
               "User: " & "" & vbCrLf & _
               "- Is authenticated: " & context.User.Identity.IsAuthenticated & vbCrLf & _
               "- AuthenticationType: " & context.User.Identity.AuthenticationType & vbCrLf & _
               "- Username: " & context.User.Identity.Name & vbCrLf & _
               "" & vbCrLf & _
               "Message:" & exOriginal.Message & vbCrLf & _
               "Stack Trace:" & exOriginal.StackTrace & vbCrLf

            If Not exOriginal.InnerException Is Nothing Then
                Dim subEx As Exception = exOriginal.InnerException
                sResult &= vbCrLf & _
                "InnerException Message:" & subEx.Message & vbCrLf & _
                "InnerException Stack Trace:" & subEx.StackTrace
            End If

            Return sResult
        End Function
    End Class

End Namespace

Codice del file /Web.config:
Nota: Se sul server web è già presente un file web.config, modificare il file esistente inserendo le righe indicate in grassetto nelle rispettive sezioni (mailSettings e httpHandlers)
<?xml version="1.0"?>
<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="Network">
                <network host="indirizzo.mailserver.com" port="25"/>
            </smtp>
        </mailSettings>
    </system.net>

    <system.web>
        <httpHandlers>
            <add verb="GET" path="*.aspx" type="GiDiNet.NotifyErrorHandler"></add>
        </httpHandlers>
    </system.web>
</configuration>

2. Configurazione e uso dello script

Per la configurazione è necessario modificare i parametri seguendo le istruzioni riportate di seguito:

Parametri del mail server (file /web.config):
Modificare la riga <network host="indirizzo.mailserver.com" port="25"/> inserendo l'indirizzo del mail server e la relativa porta.

Messaggi di errore e e-mail di notifica (file /App_Code/NotifyErrorHandler.vb)
Modificare la riga: Const ErrorPagePath As String = "/errorpage.aspx"
Inserendo il percorso relativo di una pagina aspx che verrà inviata al visitatore quando si verifica un errore.

Nel metodo NotifyErrorToAdmin, modificare le righe:
.From = New Net.Mail.MailAddress("from@domain.com") 'Mittente
.To.Add(New Net.Mail.MailAddress("to@domain.com")) 'Destinatario
Inserendo gli indirizzi e-mail da utilizzare come mittente e destinatario del messaggio e-mail.
Sempre nel metodo NotifyErrorToAdmin è possibile personalizzare il messaggio inviato.

Pubblicato da: Daniele Iunco il 08/04/2007


Sei interessato a ulteriori informazioni su un particolare argomento? Potete contattaci attraverso l'apposito modulo.

ATTENZIONE: Le operazioni elencate nel sito possono avere esiti negativi o diversi da quanto indicato. Si consiglia di procedere con cautela.
Decliniamo ogni responsabilità per eventuali danni e/o malfunzionamenti derivanti dall'applicazione di ciò che è riportato in queste pagine.
Realizzazione a cura di GiDiNet