Come aggiungere traccia ai moduli gestiti di IIS 7.0
di Saad Ladki
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
Seguire questa procedura prima di eseguire le attività in questo articolo.
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)
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".
Eseguire un backup della configurazione prima di eseguire le attività in questo articolo. Eseguire questo comando:
Fare clic sul pulsante Start - Tutti i programmi ->> Accessori -> Prompt dei comandi (r-click)-> Esegui come amministratore
Eseguire il comando seguente nel prompt dei comandi:
%windir%\system32\inetsrv\appcmd add backup
- Eliminare tutto nella
c:\inetpub\wwwroot
cartella. - 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).
In questa sezione viene creato un modulo di esempio per instrumentare.
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()
{
}
}
}
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()
{
}
}
}
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
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.
Questa sezione include l'aggiunta e il test del modulo.
- Usando lo stesso prompt dei comandi amministratore, eseguire una directory denominata \inetpub\wwwroot\bin, quindi copiare IIS_MOD_REQDATA.dll su tale directory.
- Abilitare il modulo. Dal prompt dei comandi amministratore digitare start inetmgr per visualizzare l'interfaccia utente di amministrazione IIS.
- Nel riquadro Connessioni espandere il nome del computer locale, quindi Siti e fare clic su Sito Web predefinito.
- In IIS nel riquadro centrale fare doppio clic su Moduli:
- 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:
- 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):
- Fare clic su OK. Il modulo appena tracciato è ora configurato per l'uso del sito Web.
Testare il modulo aprendo Internet Explorer e passando a http://localhost/test.htm
. Viene visualizzata la finestra seguente:
Il contenuto "REQUEST HEADERS" & "RESPONSE HEADERS" proviene dal modulo, indicando che funziona.
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.
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.
Usando il prompt dei comandi amministratore, passare a
c:\inetpub\wwwroot
e usare il blocco note per modificare il file di web.config.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.
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.
Definire traceSource in base al nome (tsStatus) e collegarlo alla & DefaultSwitch & IisTraceListener.
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:
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:
Nella finestra di dialogo successiva configurare quanto segue:
Selezionare la casella di controllo Abilita . Mantenere le impostazioni predefinite per le altre impostazioni. Per continuare scegliere OK .
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
Nel riquadro Azioni fare clic su Aggiungi. Verrà avviata la procedura guidata Aggiungi regola di traccia richiesta non riuscita .
Nella pagina Specifica contenuto da traccia selezionare l'opzione Tutti i contenuti (*) per la traccia. Fare clic su Avanti.
Nella schermata Definisci condizioni di traccia selezionare la casella di controllo Codici di stato & immettere "200" come codice di stato da tracciare.
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.
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.
Fare clic su Fine. Viene visualizzata la definizione seguente per il sito Web predefinito:
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:
- Aprire una nuova finestra di Internet Explorer. Digitare nell'indirizzo
http://localhost/test.htm
. Di nuovo, viene visualizzato quanto segue:
- 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. - Selezionare il file fr#.xml (data odierna) e fare clic su Apri. Gli eventi sono visualizzati:
È 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.