Traccia

 

Rob Howard
Microsoft Corporation

25 gennaio 2001

Ogni volta che faccio una presentazione su ASP.NET, è sempre divertente watch il pubblico quando viene illustrata la nuova funzionalità di traccia. Per coloro che hanno creato soluzioni con ASP, la traccia è un dio!

Nella colonna di questo mese verrà esaminata la funzionalità di traccia in ASP.NET. Iniziamo parlando della tecnica di traccia comune per ASP, Response.Write().

Traccia con ASP

Se mi piace, quando si esegue il codice di un'applicazione ASP si usano istruzioni Response.Write() quando si sta descrivendo una sezione problematica del codice.

Ecco alcuni codice pseudo per illustrare questo punto:

<%
On Error Resume Next 
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>

Le chiamate Response.Write() nel codice precedente dovrebbero essere abbastanza familiari, ad esempio si è verificato un errore con il comportamento del codice. L'errore non è necessariamente un errore dell'applicazione o del sistema, ad esempio un errore di caricamento dell'oggetto, ma piuttosto un errore di codifica in cui il codice viene eseguito come previsto, ma non restituisce il valore previsto.

Naturalmente, è anche possibile usare un debugger, ma a volte è solo più veloce ottenere un output di traccia per scoprire cosa sta facendo il codice o per comunicare semplicemente come viene eseguita una sezione specifica del codice.

Anche se le istruzioni Repsonse.Write() semplificano il debug dell'applicazione piuttosto rapidamente, introducono codice non necessario in un'applicazione che può causare bug reali che interrompono le applicazioni distribuite. Ad esempio, in genere non è considerato una cosa buona quando si dimentica di rimuovere un'istruzione Response.Write() più colorata che potrebbe esprimere i nostri veri sentimenti sul codice su cui stiamo lavorando.

Naturalmente, le stesse funzionalità delle istruzioni Response.Write() sono supportate all'interno di ASP.NET. Infatti, ho ancora trovato me stesso usando Response.Write() anche se ora abbiamo una funzionalità di traccia. Le vecchie abitudini sono difficili da rompere.

Tuttavia, dovremmo tutti provare a interrompere le vecchie abitudini perché la nuova funzionalità di traccia ci dà qualcosa che non esiste in modalità ASP: debug.

Traccia con ASP.NET

Le nuove funzionalità di traccia di ASP.NET consentono di simulare istruzioni Response.Write(), ma non si preoccupano di rimuovere le istruzioni prima di distribuire le applicazioni. Si supponga invece di scrivere lo stesso codice precedente, ma anziché usare Response.Write(), si usa Trace.Write().

L'oggetto Trace è ora un oggetto pagina intrinseco, simile a Request, Response, Server e così via. È accessibile direttamente con il codice della pagina.

Esaminiamo brevemente la classe Trace .

Trace (classe)

La traccia viene esposta come proprietà pubblica all'interno di pagine ASP.NET. Quando si usa la proprietà Trace , si usa un'istanza della classe TraceContext definita nello spazio dei nomi System.Web .

La classe Trace espone due metodi di overload e due proprietà. I due metodi Warn() e Write(), entrambi supportano due prototipi identici:

VB.NET

Public Sub [Warn | Write](category As String, 
                          message As String, 
                          errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String, 
                          message As String)
End Sub

C#

public void [Warn | Write](String category, 
                           String message, 
                           Exception errorInfo)
public void [Warn | Write](String category, 
                           String message)

Il parametro categoria viene usato per identificare il nome della categoria in cui scrivere il valore del messaggio . Questo diventerà più evidente quando si usa il metodo Write() in un esempio seguente. Il terzo parametro supportato sia Warn() che Write() nei metodi di overload è errorInfo. Ciò consente di passare i dettagli dell'eccezione nel sistema di traccia.

Proprietà

La classe TraceContext supporta due proprietà pubbliche: IsEnabled e TraceMode.

  • IsEnabled indica se la traccia è abilitata nella pagina o per l'applicazione.
  • TraceMode imposta o restituisce la modalità di ordinamento usata dalla traccia. Si esaminerà la configurazione della modalità di traccia quando si illustra la traccia a livello di applicazione seguente.

Dopo aver visto che la classe e i metodi e le proprietà supportate dalla classe TraceContext sono simili, verrà illustrato un esempio di Trace.Write().Write().

<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
  Trace.Write("Inside Add() a: ", a.ToString())
  Trace.Write("Inside Add() b: ", b.ToString())
  return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>

Quando questo codice viene eseguito l'output è:

Figura 1. Esempio di metodo Trace.Write()

Ovviamente viene chiamato il metodo Add(). Tuttavia, a differenza delle istruzioni Repsonse.Write(), le istruzioni Trace.Write() non vengono visualizzate all'interno dell'output risultante. Per visualizzare i risultati delle istruzioni Trace.Write(), è necessario abilitare la traccia per questa pagina o per l'applicazione.

Per abilitare la traccia, è possibile usare una direttiva di pagina o un'opzione di configurazione. Esaminiamo entrambi.

Direttiva traccia pagina

Le direttive di pagina sono istruzioni speciali usate ASP.NET durante l'elaborazione di una richiesta per una risorsa ASP.NET. Le direttive di pagina possono essere usate per eseguire l'override o applicare le impostazioni di configurazione per una pagina ASP.NET.

Una direttiva deve essere il primo elemento in una pagina. Viene dichiarato usando la sintassi seguente:

<%@ Directive Attribute="[Value]" %>

Usando la sintassi precedente, ecco come si dice ASP.NET che si vuole eseguire la traccia abilitata in una pagina:

<%@ Page Trace="true" %>

Se si aggiunge la direttiva precedente al codice di esempio, l'output della pagina è piuttosto diverso:

Figura 2. Traccia abilitata

L'output della traccia viene ora aggiunto nella parte inferiore della pagina. L'output di traccia viene sempre aggiunto alla fine della pagina.

Verrà quindi illustrato come abilitare la traccia a livello di applicazione. Verrà quindi illustrato cosa contiene l'output di traccia.

Traccia dell'applicazione

ASP.NET usa i file di configurazione XML per impostare le impostazioni di configurazione per le applicazioni ASP.NET. Ogni ASP.NET installazione installa un file di configurazione nella [unità di sistema]\WinNt\Microsoft.NET\Framework\[versione]\ directory denominata config.web.

Il file di configurazione imposta la configurazione ASP.NET predefinita e in Beta 1 è noto come file di configurazione radice. Le modifiche apportate all'interno di questo file influiscono su tutte le applicazioni Web ASP.NET. È anche possibile usare i file di configurazione nelle applicazioni Web per aggiungere o rimuovere le impostazioni acquisite dal file config.web predefinito.

Verranno illustrate in dettaglio la configurazione in una colonna futura. A questo punto, verrà usato il file di configurazione radice per applicare le impostazioni di traccia per tutte le applicazioni ASP.NET.

Sezione Traccia

Se si apre il file config.web radice, verrà visualizzata una sezione di traccia:

<configuration>
    <trace
        enabled="false"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

Per l'elemento di traccia sono disponibili quattro attributi:

  • enabled = "[true/false]": è possibile impostare l'opzione abilitata su true o false. La traccia è abilitata a livello di applicazione oppure è disabilitata a livello di applicazione. Se è stato impostato enabled=false, la traccia di pagina è ancora supportata usando la direttiva Trace illustrata in precedenza.
  • requestlimit = " [int]"- Numero totale di richieste di traccia per mantenere memorizzata nella cache in memoria in base all'applicazione. La traccia espone una risorsa speciale, trace.axd, che verrà esaminata in modo momentaneo, che viene usata per visualizzare l'output di traccia quando pageoutput è impostato su false.
  • pageoutput = " [true/false]"- Quando la traccia è abilitata tramite il file di configurazione, l'amministratore può abilitare o disabilitare la traccia in ogni pagina. La traccia pageoutput abilita i dettagli di traccia per ogni pagina all'interno di un'applicazione. Tuttavia, la traccia pageoutput può essere disattivata mentre la traccia a livello di applicazione è ancora abilitata (true" abilitata = "). Ciò mantiene le richieste di traccia in memoria, in modo che siano disponibili tramite trace.axd, che verranno esaminate in modo momentaneo, ma non visualizzate all'interno dell'output di una pagina.
  • tracemode = "[SortByTime | SortByCategory]": l'impostazione tracemode fornisce il controllo sulla modalità di output delle informazioni dettagliate sulla traccia. I dati possono essere ordinati in base al tempo o alla categoria, in cui la categoria è differenziata tra le impostazioni effettuate dal sistema e le impostazioni Trace.Write() abilitate dallo sviluppatore. Nell'esempio, ad esempio, è stata usata la seguente: Trace.Write(Inside Add(")a:", a.ToString() ) Il primo parametro dell'istruzione Trace.Write(). è la categoria. In questo caso è stata definita categoria come "Inside Add() a:". Se è stato ordinato per categoria (tracemode = "SortByCategory"), questo elemento verrà ordinato prima delle chiamate della normale funzione di pagina nell'output di traccia. L'ordinamento in base al tempo, invece, ordina in base alla quantità di tempo trascorso nella chiamata.

Uso della traccia dell'applicazione

Usando lo stesso codice di esempio precedente, è possibile rimuovere la direttiva della pagina e abilitare la stessa funzionalità modificando le impostazioni config.web di traccia.

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="true"
        tracemode="SortByTime"
    />
</configuration>

È ora possibile chiamare l'applicazione di esempio, rimuovere la direttiva Pagina e ottenere lo stesso output:

Figura 3. Traccia abilitata, nessuna direttiva Page

Ma cosa accade se si vuole usare la funzionalità menzionata in precedenza, in cui è possibile abilitare la traccia ma disabilitare l'output nella pagina?

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

Se è stata richiesta l'applicazione di esempio con le impostazioni di configurazione precedenti, non verrà restituito alcun output di traccia, anche se la traccia è ancora abilitata. Per visualizzare l'output della traccia, viene usata un'applicazione speciale denominata trace.axd.

Axd

Trace.axd è un gestore Http. Un gestore Http è un'opzione di codifica che consente di gestire richieste/risposte al livello più semplice. I gestori HTTP sono gli equivalenti delle estensioni ISAPI. A differenza di ISAPI, tuttavia, possono essere creati usando qualsiasi linguaggio .NET. Verranno illustrati i gestori Http in modo più dettagliato in una colonna successiva.

Trace.axd è un gestore Http che è possibile usare per richiedere i dettagli della traccia dell'applicazione. Quando richiesto, verrà fornito un log di traccia delle ultime richieste n; n è determinato dal valore impostato da requestlimit="[int]" nel file di configurazione.

Per usare trace.axd, è sufficiente richiedere trace.axd nella stessa directory dell'applicazione che è stata effettuata la richiesta per l'applicazione di esempio:

Figura 4. Richieste di traccia dell'applicazione

Come si può vedere dalla schermata, viene presentato un elenco di tracce che è possibile visualizzare. Queste visualizzazioni di traccia sono identiche ai dettagli che la traccia aggiungerebbe alla pagina, senza l'output della pagina inclusa:

Figura 5. Dettagli della richiesta

Dopo aver illustrato come configurare e usare la traccia, viene illustrato l'output della traccia.

Interpretazione dell'output della traccia

L'output fornito dalla visualizzazione di traccia, tramite Trace.axd o in una pagina, fornisce sei sezioni di dettaglio:

  • Dettagli della richiesta: si tratta di informazioni di base, ad esempio l'ID sessione, l'ora della richiesta, il tipo di richiesta Http e il codice di stato della risposta Http.
  • Informazioni sulla traccia: questa sezione fornisce una visualizzazione tabella di categorie e messaggi. Se si usano istruzioni Trace.Write() nel codice, i due parametri accettati da Trace.Write() vengono usati rispettivamente come valori Category e Message . Inoltre, viene fornito il tempo dal primo all'ultimo byte.
  • Albero di controllo: anche se non ancora descritto in questa colonna, ASP.NET usa i controlli server per consentire di compilare applicazioni dichiarative. La sezione Albero di controllo fornisce informazioni sui controlli all'interno della pagina. Viene fornito l'ID, il tipo, le dimensioni del rendering e le dimensioni dello stato di visualizzazione del controllo. Queste informazioni ci offrono un'idea dei controlli usati, nonché dei costi associati (dimensioni del rendering e dello stato di visualizzazione).
  • Raccolta di cookie: vengono visualizzati i cookie inviati dal client nelle intestazioni della richiesta e vengono visualizzati i relativi nomi, valori e dimensioni.
  • Raccolta intestazioni: le intestazioni Http presentate dal client al server vengono fornite in questa sezione. Si tratta di una tabella semplice che elenca Nome/Valore.
  • Variabili del server: la sezione variabili del server presenta una tabella di coppia Name/Value delle variabili del server.

Uso della traccia

Come si può notare chiaramente, la traccia è una nuova funzionalità ASP.NET potente progettata per semplificare lo sviluppo di applicazioni Web. Tuttavia, pensavo che sarebbe anche utile menzionare quando dovresti e non dovresti usare la traccia.

Applicazioni distribuite

La traccia aggiunge un sovraccarico aggiuntivo alle richieste e non deve essere abilitata per le applicazioni distribuite. Le istruzioni Trace.Write() possono tuttavia essere lasciate in perché vengono ignorate quando la traccia non è abilitata.

Per le applicazioni distribuite in cui si desidera acquisire i dati, è consigliabile usare le classi trovate nello spazio dei nomi System.Diagnostics . Queste classi, che cercherò di coprire in una colonna futura, consentono di scrivere direttamente nel registro eventi di Windows.

È consigliabile usare sicuramente la traccia quando si sta creando un'applicazione, ma disabilitarla quando si è pronti per distribuire l'applicazione, proprio come si sarebbero rimosse tali istruzioni Response.Write().

Disabilitazione di Trace.axd

Se è stato installato ASP.NET in un server Web di produzione, è consigliabile disabilitare in modo esplicito Trace.axd. Aprire il file config.web radice, trovare la <httphandlers> sezione e aggiungere la voce seguente:

<configuration>
        <add verb="*" 
             path="trace.axd"
             type="System.Web.Handlers.TraceHandler" />
        <remove verb="*" path="trace.axd"/>
</configuration>

Nota: È anche possibile tagliare l'intera voce, ma l'opzioneremove><è migliore perché lascia il codice nel file di configurazione e ottiene lo stesso obiettivo, disabilitando trace.axd.<add/> Questo verrà risolto in Beta 2 di ASP.NET.

Riepilogo

La funzionalità di traccia in ASP.NET è un nuovo potente modo per tracciare le operazioni che l'applicazione sta facendo. In passato sono stati usati istruzioni Response.Write() per tracciare l'applicazione durante l'esecuzione, ma è ora possibile usare istruzioni Trace.Write() e lasciare queste istruzioni nel codice distribuito. Ciò comporta un minor numero di bug perché non viene rimosso il codice quando si è pronti per distribuire l'applicazione.

risorse ASP.NET

Infine, volevo chiamare alcune delle nuove risorse ASP.NET disponibili. Per altre risorse ASP.NET, visitare https://www.asp.net la pagina per altre informazioni.

Rob Howard è un responsabile del programma per ASP.NET nel team di .NET Framework. Passa tutto il tempo libero che ha con la sua famiglia o vola pesca a Washington orientale.