Condividi tramite


Come aggiungere traccia ai moduli gestiti di IIS 7.0

di Saad Ladki

Introduzione

IIS 7.0 e versioni successive offre la possibilità di collegare e usare moduli gestiti sviluppati personalizzati per eseguire molte attività diverse e usare tali moduli per tutti i tipi di contenuto. Tuttavia, la domanda si pone: cosa accade se il modulo presenta problemi o difficoltà? In precedenza, è stato usato System.Diagnostics per tracciare l'evento quando si sono verificati problemi. Sfortunatamente, tali tracce sono completamente separate dalle tracce IIS.

Non così con IIS 7.0 e versioni successive. È ora possibile aggiungere tracce al codice del modulo usando System.Diagnostics.TraceSource (novità di .Net 2.0). È possibile instradare tali tracce nell'infrastruttura di traccia IIS in modo che siano disponibili per i moduli che utilizzano tracce, ad esempio La traccia delle richieste non riuscite.

Il team IIS incoraggia la strumentazione del codice usando modelli di base, ad esempio:

  • Eventi START & STOP relativi alle attività chiave all'interno del codice
  • WARNING & ERROR eventi per occorrenze impreviste che potrebbero causare l'esito negativo della richiesta (ad esempio l'autenticazione non riuscita)
  • Eventi INFORMATIONAL & VERBOSE per assistenza nella diagnostica, ad esempio la configurazione del modulo in uso

Le attività illustrate in questa procedura dettagliata includono:

  • Aggiungere il tracciamento al modulo tramite System.Diagnostics.TraceSource
  • Configurazione del tracciamento delle richieste non riuscite per raccogliere queste tracce
  • Generazione della condizione di errore e visualizzazione della traccia risultante

Prerequisiti

Seguire questa procedura prima di eseguire le attività in questo articolo.

Passaggio 1: Installazione di IIS

Prima di tutto, è necessario installare IIS. Verificare se IIS è installato passando a http://localhost/. Se IIS è installato, viene visualizzata la pagina "in costruzione". Se IIS non è installato, vedere Installazione di IIS per istruzioni. Assicurarsi di installare i componenti IIS seguenti:

  • ASP (in Servizi Web a livello mondiale => Funzionalità di sviluppo di applicazioni => ASP)
  • ASP.Net (in Servizi Web mondiali => Funzionalità di sviluppo di applicazioni => ASP.Net)
  • Tracciamento (in Servizi World Wide Web => Salute e diagnostica => Tracciamento)

Passaggio 2: Accedere come amministratore

Accedere come l'account amministratore o nel gruppo Amministratori.

Annotazioni

Il gruppo Administrators non concede privilegi di amministratore completi per impostazione predefinita. È necessario eseguire molte applicazioni come amministratore. Fare clic con il pulsante destro del mouse sull'icona dell'applicazione e scegliere "Esegui come amministratore".

Passaggio 3: Eseguire un backup

Eseguire un backup della configurazione prima di eseguire le attività in questo articolo. Esegui le operazioni seguenti:

  1. Fare clic sul pulsante Start -> Tutti i programmi -> Accessori -> (r-click)Prompt dei comandi -> Esegui come amministratore
    Screenshot del menu Start di Windows, evidenziando l'opzione

  2. Eseguire il comando seguente nel prompt dei comandi:

    %windir%\system32\inetsrv\appcmd add backup
    

Passaggio 4: Creazione di contenuto di esempio

  1. Eliminare tutti gli elementi nella c:\inetpub\wwwroot cartella .
  2. Dal prompt dei comandi dell'amministratore avviato in precedenza incollare il codice allegato in un file inetpub\wwwroot denominato test.htm:
<h2>HOWTO: Adding tracing to modules </h2>
This is a sample page served by the static file handler (native code).

Creazione e tracciamento di un modulo semplice

In questa sezione, creerai un modulo di esempio da strumentare.

Passaggio 1: Creare un modulo semplice

Usando il prompt dei comandi amministratore, copiare e incollare il codice seguente in un file denominato IIS_MOD_REQDATA.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
        }

        public void Dispose()
        {
        }
    }
}

Passaggio 2: Aggiunta del tracciamento al modulo gestito

Per aggiungere traccia al modulo e indirizzarne gli eventi di traccia in IIS, usare l'origine System.Diagnostics.Trace. Aggiungere la riga seguente sotto le istruzioni using:

using System.Diagnostics;

È necessario creare un oggetto TraceSource all'interno del codice: si noti la definizione di traceSource all'interno della dichiarazione del modulo IIS_MOD_REQDATA:

public class IIS_MOD_REQDATA : IHttpModule
{
    TraceSource tsStatus;

Il membro tsStatus viene inizializzato durante il metodo Init() di IHttpModule:

public void Init(HttpApplication application)    
{    
    application.EndRequest += (new EventHandler(this.Application_EndRequest));
    // setup traceSource
    tsStatus = new TraceSource("tsStatus");    
}

Il nome di TraceSource ("tsStatus") è importante, perché questo nome viene successivamente fatto riferimento nel file web.config in un secondo momento. Il modulo è ora configurato per generare eventi, se necessario.

Per aggiungere un nuovo evento di traccia, usare tsStatus.TraceEvent(<type>, 0, <somestring>) per scrivere eventi. Aggiungere gli eventi Start & End consigliati al metodo Application_EndRequest():

private void Application_EndRequest(Object source, EventArgs e)        
{    
    tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

    // other code

    tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] END EndRequest");    
}

Si notino i diversi< tipi>: i tipi supportati, tra gli altri, includono:

  • TraceEventType.Start
  • TraceEventType.Stop
  • TraceEventType.Error
  • TraceEventType.Warning
  • TraceEventType.Information
  • TraceEventType.Verbose

Per completezza, l'intero codice sorgente per il modulo (inclusi gli eventi di traccia), possono essere copiati da qui:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Diagnostics;

namespace IIS_MOD_REQDATA
{
    public class IIS_MOD_REQDATA : IHttpModule
    {

        TraceSource tsStatus;

        public void Init(HttpApplication application)
        {
            application.EndRequest += (new EventHandler(this.Application_EndRequest));

            // TRACING

            tsStatus = new TraceSource("tsStatus");
        }

        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;

            tsStatus.TraceEvent(TraceEventType.Start, 0, "[REQDATA MODULE] START EndRequest");

            // start writing out the request data

            context.Response.Write("<hr>");
            context.Response.Write("<b><font size=2 color=green>REQUEST HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("METHOD : " + context.Request.HttpMethod + "<br>");
            context.Response.Write("URL : " + context.Request.Url + "<br>");
            context.Response.Write("QUERYSTRING : " + context.Request.QueryString + "<br>");
            context.Response.Write("</font><br>");

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Req Data, moving onto Response");

            // now response data

            context.Response.Write("<b><font size=2 color=blue>RESPONSE HEADERS</font></b><br>");
            context.Response.Write("<font size=2>");
            context.Response.Write("STATUS CODE : " + context.Response.StatusCode.ToString() + "." + context.Response.SubStatusCode.ToString() + "<br>");
            context.Response.Write("CONTENT TYPE : " + context.Response.ContentType.ToString() + "<br>");
            context.Response.Write("EXPIRES : " + context.Response.Expires.ToString() + "<br>");
            context.Response.Write("</font><br>");

            if (context.Response.StatusCode > 399)
            {
                tsStatus.TraceEvent(TraceEventType.Warning, 0, "[REQDATA MODULE] error status code detected");
            }

            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] done with Response Data");

            // set cache policy on response so it's not cached.

            context.Response.DisableKernelCache();
            tsStatus.TraceEvent(TraceEventType.Verbose, 0, "[REQDATA MODULE] cache setting is (" + context.Response.Cache.ToString() + ")");

            tsStatus.TraceEvent(TraceEventType.Stop, 0, "[REQDATA MODULE] STOP - EndRequest");
        }

        public void Dispose()
        {
        }
    }
}

Passaggio 3: Compilazione del modulo tracciato

Ora, per compilare il modulo e distribuirlo. Nel prompt dei comandi amministratore eseguire il comando seguente:

%systemroot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /target:library /out:IIS_MOD_REQDATA.dll /debug /d:TRACE /R:System.Web.dll IIS_MOD_REQDATA.cs

Screenshot del comando del trattino esclamativo consoleMain nel Blocco note.

Annotazioni

Se si esegue questa operazione in un sistema a 64 bit, compilare usando il compilatore c# a 64 bit in %windir%\microsoft.net\framework64\v2.0.50727\csc.exe

Si noti l'uso delle opzioni /debug e /d:TRACE . È necessario usare queste opzioni per compilare gli eventi di traccia nel file binario. Se non si esegue la compilazione con queste opzioni, il modulo non avrà alcun evento di traccia.

Dopo aver compilato il modulo, distribuire il modulo ed eseguire un test iniziale per verificare se il modulo funziona prima di acquisire le relative tracce.

Aggiunta di moduli alla configurazione del sito

Questa sezione include l'aggiunta e il test del modulo.

Passaggio 1: Aggiunta del modulo alla configurazione del sito

  1. Usando lo stesso prompt dei comandi amministratore, creare una directory denominata \inetpub\wwwroot\bin, quindi copiare IIS_MOD_REQDATA.dll in tale directory.
  2. Abilitare il modulo. Dal prompt dei comandi dell'amministratore digitare start inetmgr per visualizzare l'interfaccia utente di amministrazione iis.
  3. Nel riquadro Connessioni espandere il nome del computer locale, quindi Siti e fare clic su Sito Web predefinito.
  4. In IIS nel riquadro centrale fare doppio clic su Moduli:
    Screenshot della schermata Home del sito Web predefinito con l'opzione Moduli evidenziata.
  5. Viene visualizzato un elenco di grandi dimensioni di moduli configurati per l'uso da parte di questo sito. Sul lato destro dell'interfaccia utente in Azioni fare clic su Aggiungi modulo gestito:
    Screenshot del riquadro Azioni con lo stato attivo sull'opzione Aggiungi Modulo Gestito.
  6. Nella finestra visualizzata denominare il modulo gestito IIS_MOD_REQDATA e il tipo del modulo è IIS_MOD_REQDATA. IIS_MOD_REQDATA(selezionare questa opzione nella casella di riepilogo a discesa):
    Screenshot della finestra di dialogo Aggiungi modulo gestito che mostra i campi Nome e Tipo.
  7. Fare clic su OK. Il modulo appena tracciato è ora configurato per l'uso del sito Web.
    Screenshot della schermata Moduli, che mostra il modulo appena tracciato.

Passaggio 2: Test del modulo

Testare il modulo aprendo Internet Explorer e passando a http://localhost/test.htm. Viene visualizzata la finestra seguente:

Screenshot di una pagina Web che legge qui è una pagina di esempio gestita dal gestore di file statici.

Il contenuto "REQUEST HEADERS" e "RESPONSE HEADERS" proviene dal nostro modulo, indicando che funziona.

Instradamento eventi verso IIS

Questa attività associa il TraceSource del modulo alla traccia IIS in modo che i relativi eventi vengano generati tramite IIS e quindi configuri la traccia delle richieste di errore per acquisire questi eventi di tracciamento.

Passaggio 1: Abilitazione del modulo TraceSource e routing dei relativi eventi in IIS

Il modulo viene aggiornato per includere gli eventi di traccia. Configurare System.Diagnostics e IIS per acquisire questi eventi di traccia e instradarli nel modulo Di traccia delle richieste non riuscite di IIS. A tale scopo, configurare la <sezione system.diagnostics> nel file web.config per configurare TraceSource e instradarne gli eventi di conseguenza.

  1. Usando il prompt dei comandi dell'amministratore, passare a c:\inetpub\wwwroote usare il Blocco note per modificare il file web.config.

  2. Esistono 3 parti della configurazione che devono essere completate per ottenere gli eventi generati dal modulo da instradare all'infrastruttura di traccia di IIS:

    • Definizione del TraceListener di evento IIS come listener condiviso
    • Definizione di un'opzione per abilitare tutti gli eventi
    • Definizione dell'origine di traccia, attaccare l'interruttore che abbiamo definito, nonché definire il listener di traccia per la nostra origine.
  3. IIS fornisce una nuova classe System.Diagnostics.TraceListener utilizzata per instradare gli eventi di TraceSource nell'infrastruttura di tracciamento di IIS. Questo provider deve essere definito anche nel file web.config.

  4. Definire traceSource in base al nome (tsStatus) e collegarlo a DefaultSwitch & IisTraceListener.

  5. Copia e incolla questa sezione <system.Diagnostics> nel tuo file web.config (dopo la sezione <system.webServer>).

    <system.diagnostics>
        <sharedListeners>
          <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </sharedListeners>
    
        <switches>
          <add name="DefaultSwitch" value="All" />
        </switches>
    
        <sources>
          <source name="tsStatus" switchName="DefaultSwitch">
            <listeners>
              <add name="IisTraceListener" type="System.Web.IisTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            </listeners>
          </source>
        </sources>
    </system.diagnostics>
    

Il traceSource tsStatus è collegato con IIS7TraceListener, che genererà eventi nell'infrastruttura di traccia di IIS. Continuare con il passaggio successivo per collegare tali eventi al provider di traccia delle richieste non riuscite.

Passaggio 2: Abilitazione della traccia delle richieste non riuscite per acquisire gli eventi di traccia del modulo

Quando questi eventi di diagnostica vengono generati nell'infrastruttura di traccia di IIS, vengono mappati al provider ASP.NET e al flag del modulo associato a quel provider. Il loro livello di dettaglio dipende dal tipo di evento di traccia utilizzato. Per configurare la traccia delle richieste non riuscite per rilevare queste:

  1. Dal prompt dei comandi dell'amministratore digitare start inetmgr. Nel pannello Connessioni espandere il nome del computer, quindi la cartella Siti, quindi fare clic sul sito Web predefinito. A destra nel riquadro Azioni fare clic sul collegamento Traccia richiesta non riuscita in Configura:
    Screenshot della sezione Gestisci sito Web del riquadro Azioni con l'opzione Traccia richiesta non riuscita evidenziata.

  2. Nella finestra di dialogo successiva configurare quanto segue:
    Screenshot della finestra di dialogo Modifica delle impostazioni di traccia delle richieste non riuscite del sito Web.

  3. Selezionare la casella di controllo Abilita . Mantenere le impostazioni predefinite per le altre impostazioni. Fare clic su OK per continuare.

  4. Dopo aver verificato che la registrazione di traccia delle richieste non riuscite è abilitata, è necessario configurare le definizioni degli errori. Tornare in Gestione IIS, in IIS, fare doppio clic su Regole di traccia delle richieste non riuscite
    Screenshot della schermata Home del sito Web predefinito con l'opzione Regole di traccia delle richieste non riuscite evidenziata.

  5. Nel riquadro Azioni fare clic su Aggiungi. Questo avvia la procedura guidata Aggiungi regola di traccia delle richieste non riuscite.

  6. Nella pagina Specifica contenuto da traccia selezionare l'opzione Tutto il contenuto (*) per le tracce. Fare clic su Avanti.
    Screenshot della pagina Aggiungi regola di traccia delle richieste non riuscite con lo stato attivo sull'opzione Avanti.

  7. Nella schermata Definisci condizioni di traccia selezionare la casella di controllo Codici di stato e immettere "200" come codice di stato da tracciare.
    Screenshot della schermata Definizione delle condizioni di traccia con il campo Codici di stato selezionato.

  8. Fare clic su Avanti. Verrà visualizzata la pagina Seleziona provider di traccia . Selezionare la casella di controllo ASPNET e le caselle di controllo Modulo e Pagina in "Aree". Sotto Verbosità, selezionare Dettagliato.
    Screenshot della schermata Seleziona provider di traccia con l'opzione Provider ASPNET evidenziata.

    Annotazioni

    A causa di un bug nelle build Server Beta 3, le tracce dei moduli possono essere acquisite solo se sono selezionate entrambe le aree Modulo e Pagina. Dopo il Server Beta 3, è necessario solo il modulo per raccogliere questi eventi.

  9. Fare clic su Fine. Viene visualizzata la definizione seguente per il sito Web predefinito:
    Screenshot della schermata Regole di traccia delle richieste fallite.

Test e visualizzazione dei risultati

In questa attività viene generata la richiesta non riuscita e viene visualizzato il log di traccia risultante. Tenere presente che IIS è stato configurato per acquisire i log di traccia per http://localhost/le richieste * che hanno esito negativo con un valore 200. Per verificare che abbia funzionato:

  1. Aprire una nuova finestra di Internet Explorer. Digitare l'indirizzo http://localhost/test.htm. Anche in questo caso, viene visualizzato quanto segue:
    Screenshot della pagina Web di esempio in una finestra di Internet Explorer.
  2. Per verificare che il modulo abbia generato tracce acquisite, usare una finestra di Internet Explorer con privilegi elevati di amministratore e premere CTRL-O, quindi passare a c:\inetpub\logs\FailedReqLogFiles\W3SVC1. Nella casella di riepilogo a discesa che legge i file HTML selezionare Tutti i file.
  3. Selezionare il file fr######.xml più recente (data odierna) e fare clic su Apri. Vedi gli eventi
    Schermata della richiesta Diagnostica, che mostra la scheda Modulo personalizzato delle traccie.

Sommario

L'aggiunta di un nuovo evento di traccia a un modulo gestito è stata completata, compilato e distribuito quel modulo, è stato configurato System.Diagnostics per instradare i suoi eventi all'infrastruttura di traccia di IIS e infine è stata configurata la funzionalità di Tracciamento delle Richieste Non Riuscite di IIS per acquisire i suoi eventi. È ora possibile aggiungere facilmente nuovi eventi al modulo, quindi ricompilare il modulo e distribuirlo nella directory \bin. Utilizzando il tracciamento delle richieste non riuscite, puoi vedere i risultati degli eventi.

Tenere presente che l'uso di System.Diagnostics.TraceSource consente comunque di usare il modulo e il relativo livello inferiore degli eventi di traccia, purché sia collegato a un listener di traccia diverso.