Share via


Come aggiungere traccia ai moduli gestiti di IIS 7.0

di Saad Ladki

Introduzione

IIS 7.0 e versioni successive consentono di collegare e usare moduli gestiti personalizzati per eseguire molte attività diverse e usare tali moduli per tutti i tipi di contenuto. Tuttavia, la domanda si verifica: cosa accade se il modulo ha problemi o difficoltà? In precedenza è stato usato System.Diagnostics per tracciare l'evento quando si sono verificati problemi. Sfortunatamente, queste 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 (nuovo a .Net 2.0). È possibile instradare tali tracce nell'infrastruttura di traccia IIS in modo che siano disponibili per i moduli che usano tracce, ad esempio traccia richiesta non riuscita.

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

  • START & ARRESTARe gli eventi intorno alle attività chiave all'interno del codice
  • AVVISO & eventi DI ERRORE per occorrenze impreviste che potrebbero causare l'esito negativo della richiesta (ad esempio l'autenticazione non riuscita)
  • INFORMATIONAL & eventi VERBOSE per informazioni sulla diagnostica, ad esempio la configurazione del modulo in uso

Le attività illustrate nella procedura dettagliata sono le seguenti:

  • Aggiunta della traccia al modulo tramite System.Diagnostics.TraceSource
  • Configurazione della traccia della richiesta non riuscita per acquisire 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

In primo luogo, IIS deve essere installato. Verificare se IIS è installato passando a http://localhost/. Se IIS è installato, viene visualizzata la pagina "in fase di costruzione". Se IIS non è installato, vedere Installazione di IIS per istruzioni. Assicurarsi di installare i componenti IIS seguenti:

  • ASP (in World Wide Web Services = Funzionalità di sviluppo applicazioni =>> ASP)
  • ASP.Net (in Servizi Web a livello mondiale = Funzionalità di sviluppo applicazioni =>> ASP.Net)
  • Traccia (in World Wide Web Services => Health & Diagnostics => Tracing)

Passaggio 2: Accedere come amministratore

Accedere come è l'account amministratore o nel gruppo Administrators.

Nota

Essere nel gruppo Administrators non concede i 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. Eseguire questo comando:

  1. Fare clic sul pulsante Start - Tutti i programmi ->> Accessori -> Prompt dei comandi (r-click)-> Esegui come amministratore
    Screenshot del menu Start di Windows con uno stato attivo sull'opzione Esegui come amministratore nel menu a discesa fare clic con il pulsante destro del mouse.

  2. Eseguire il comando seguente nel prompt dei comandi:

    %windir%\system32\inetsrv\appcmd add backup
    

Passaggio 4 : Creazione di contenuto di esempio

  1. Eliminare tutto nella c:\inetpub\wwwroot cartella.
  2. Dal prompt dei comandi amministratore avviato in precedenza incollare il codice collegato 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 di & traccia di un modulo semplice

In questa sezione viene creato un modulo di esempio per instrumentare.

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 della traccia al modulo gestito

Per aggiungere traccia al modulo e instradare gli eventi di traccia in IIS, usare l'origine System.Diagnostics.Trace. Aggiungere la riga seguente nelle 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, poiché questo nome viene fatto riferimento più avanti 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 noti che i <>tipi supportati, tra gli altri, includono:

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

Per la completezza, l'intera origine per il modulo (inclusi gli eventi di traccia), può essere copiata 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 & 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 della console del trattino di codice esclamativoMain nel Blocco note.

Nota

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

Si noti l'uso delle opzioni /debug & /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à eventi 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 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, eseguire una directory denominata \inetpub\wwwroot\bin, quindi copiare IIS_MOD_REQDATA.dll su tale directory.
  2. Abilitare il modulo. Dal prompt dei comandi 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 elevato 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 assegnare un nome al 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" & "RESPONSE HEADERS" proviene dal modulo, indicando che funziona.

Routing di eventi in IIS

Questa attività collega TraceSource del modulo fino alla traccia IIS in modo che gli eventi vengano generati tramite IIS e quindi configura Traccia richiesta di errore per acquisire questi eventi di traccia.

Passaggio 1: Abilitazione del modulo TraceSource & routing degli eventi in IIS

Il modulo viene aggiornato per includere 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. Eseguire questa operazione configurando la <sezione system.diagnostics> nel file web.config per configurare traceSource & instradarne di conseguenza gli eventi.

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

  2. Sono disponibili 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 dell'evento IIS come listener condiviso
    • Definizione di un commutatore per abilitare tutti gli eventi
    • Definizione dell'origine di traccia, collegamento dell'opzione definita e definizione del listener di traccia per l'origine.
  3. IIS invia un nuovo system.Diagnostics.TraceListener usato per instradare gli eventi TraceSource nell'infrastruttura di traccia di IIS. Questo provider deve essere definito anche nel file di web.config.

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

  5. Copiare e incollare questo <sistema. > Sezione Diagnostica nel file di web.config (dopo la <system.webServer> sezione).

    <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>
    

TsStatus traceSource viene cablato fino all'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 di ASP.net & il flag del modulo nel provider. La loro verbosità dipende dal TraceEventType usato. Per configurare la traccia richiesta non riuscita per selezionare queste operazioni:

  1. Dal prompt dei comandi 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 inConfigura:
    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 impostazioni richiesta non riuscita sito Web.

  3. Selezionare la casella di controllo Abilita . Mantenere le impostazioni predefinite per le altre impostazioni. Per continuare scegliere OK .

  4. Dopo aver verificato che la registrazione della traccia delle richieste non riuscita è abilitata, è necessario configurare le definizioni di errore. 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 evidenziate.

  5. Nel riquadro Azioni fare clic su Aggiungi. Verrà avviata la procedura guidata Aggiungi regola di traccia richiesta non riuscita .

  6. Nella pagina Specifica contenuto da traccia selezionare l'opzione Tutti i contenuti (*) per la traccia. Fare clic su Avanti.
    Screenshot della pagina Aggiungi regola di traccia richiesta non riuscita con uno stato attivo sull'opzione Avanti.

  7. Nella schermata Definisci condizioni di traccia selezionare la casella di controllo Codici di stato & immettere "200" come codice di stato da tracciare.
    Screenshot della schermata Definisci 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 & Pagina in "Aree". In Verbosity selezionare Verbose.
    Screenshot della schermata Seleziona provider di traccia con l'opzione Provider ASPNET evidenziata.

    Nota

    A causa di un bug nelle compilazioni Server Beta 3, le tracce dei moduli possono essere acquisite solo se vengono selezionate entrambe le aree Modulo e Pagina. Post Server Beta 3, è necessario solo 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 richieste non riuscite.

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 funzioni:

  1. Aprire una nuova finestra di Internet Explorer. Digitare nell'indirizzo http://localhost/test.htm. Di nuovo, 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 file HTML selezionare Tutti i file.
  3. Selezionare il file fr#.xml (data odierna) e fare clic su Apri. Gli eventi sono visualizzati:
    Screenshot della schermata Diagnostica richiesta che mostra la scheda Tracce modulo personalizzate.

Riepilogo

È stato completato l'aggiunta di un nuovo evento di traccia a un modulo gestito, compilato e distribuito, configurato System.Diagnostics per instradare gli eventi all'infrastruttura di traccia di IIS e infine configurare la funzionalità Di traccia delle richieste non riuscite di IIS per acquisire gli eventi. È ora possibile aggiungere facilmente nuovi eventi al modulo, quindi ricompilare il modulo & distribuirlo nella directory \bin. Usando La traccia delle richieste non riuscite, viene visualizzato il risultato degli eventi.

Tenere presente che l'uso di System.Diagnostics.TraceSource consente di usare comunque il modulo e i relativi eventi di traccia a livello inferiore, a condizione di collegarlo a un listener di traccia diverso.