Wie die Ablaufverfolgung zu verwalteten IIS 7.0-Modulen zugefügt wird
von Saad Ladki
Einführung
IIS 7.0 und höher bietet die Möglichkeit, benutzerdefinierte, verwaltete Module einzubinden und zu verwenden, um viele verschiedene Aufgaben zu erfüllen und diese Module für alle Arten von Inhalten zu verwenden. Die Frage stellt sich jedoch: Was geschieht, wenn das Modul Probleme oder Schwierigkeiten aufweist? Zuvor hat man System.Diagnostics verwendet, um das Ereignis nachzuverfolgen, wenn Probleme aufgetreten sind. Leider sind diese Verfolgungsmöglichkeiten vollständig von IIS-Ablaufverfolgungen getrennt.
Anders ist es bei IIS 7.0 und höher. Jetzt können Sie dem Modulcode mithilfe von System.Diagnostics.TraceSource (neu bei .Net 2.0) Ablaufverfolgungen zufügen. Es besteht die Möglichkeit, diese Ablaufverfolgungen in die IIS-Ablaufverfolgungsinfrastruktur weiterzuleiten, sodass sie für Module verfügbar sind, die Ablaufverfolgungen nutzen, z. B. Fehleranforderung-Ablaufverfolgung.
Das IIS-Team empfiehlt das Instrumentieren von Code mithilfe von grundlegenden Mustern, etwa:
- START & STOP-Ereignisse rund um wichtige Aktivitäten in Ihrem Code
- WARNING und ERROR Ereignisse für unerwartete Vorkommen, die dazu führen können, dass die Anforderung fehlschlägt (z. B. fehlgeschlagene Authentifizierung)
- INFORMATIONAL & VERBOSE-Ereignisse zur Unterstützung bei der Diagnose, etwa bei der verwendeten Modulkonfiguration
In dieser exemplarischen Vorgehensweise werden u. a. folgende Aufgaben veranschaulicht:
- Die Ablaufverfolgung zum Modul zufügen, mithilfe von System.Diagnostics.TraceSource
- Konfigurieren fehlgeschlagener Ablaufverfolgung-Anforderungen zur Erfassung dieser Abläufe
- Generieren der Fehlerbedingung und Anzeigen des resultierenden Ablauf
Voraussetzungen
Führen Sie die folgenden Schritte durch, bevor Sie die Aufgaben in diesem Artikel ausführen.
Schritt 1: IIS installieren
Zuerst muss IIS installiert werden. Prüfen Sie, ob IIS installiert ist, navigieren Sie dazu zu http://localhost/
. Ist IIS bereits installiert, wird die Seite "im Bau" angezeigt. Ist IIS nicht installiert, lesen Sie die Anweisungen unter IIS installieren. Vergewissern Sie sich, dass Sie die folgenden IIS-Komponenten installieren:
- ASP (unter World Wide Web Services = >Anwendungsentwicklungsfeatures => ASP)
- ASP.Net (unter World Wide Web Services =>Anwendungsentwicklungsfeatures => ASP.Net)
- Ablaufverfolgung (unter World Wide Web Services =>Integrität und Diagnose => Verfolgung)
Schritt 2: Als Administrator anmelden
Melden Sie sich als Administratorkonto oder in der Gruppe "Administratoren" an.
Hinweis
Durch das Anmelden in der Gruppe "Administratoren" erhalten Sie standardmäßig keine vollständigen Administratorrechte. Als Administrator müssen Sie viele Anwendungen ausführen. Klicken Sie mit Rechts auf das Anwendungssymbol, und wählen Sie "Als Administrator ausführen".
Schritt 3: Ein Backup erstellen
Bevor Sie die Aufgaben in diesem Artikel ausführen, erstellen Sie eine Sicherung der Konfiguration. Führen Sie Folgendes aus:
Klicken Sie auf die Schaltfläche "Start" -> Alle Programme -> Zubehör -> (R-Klick)-Eingabeaufforderung -> Als Administrator ausführen
Den folgenden Befehl an dieser Eingabeaufforderung ausführen:
%windir%\system32\inetsrv\appcmd add backup
Schritt 4: Beispielinhalte erstellen
- Alles im
c:\inetpub\wwwroot
Ordner löschen. - Fügen Sie an der oben gestarteten Administrator-Eingabeaufforderung den angefügten Code in eine Datei unter inetpub\wwwroot namens test.htmein:
<h2>HOWTO: Adding tracing to modules </h2>
This is a sample page served by the static file handler (native code).
Ein einfaches Modul erstellen und nachverfolgen
In diesem Abschnitt erstellen Sie ein Beispiel-Modul zum Instrumentieren.
Schritt 1: Ein einfaches Modul erstellen
Mithilfe der Administrator-Eingabeaufforderung den folgenden Code kopieren und in eine Datei mit dem Namen IIS_MOD_REQDATA.cs einfügen:
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()
{
}
}
}
Schritt 2: Die Ablaufverfolgung zum verwalteten Modul zufügen
Benutzen Sie die System.Diagnostics.Trace-Quelle, um ihrem Modul Ablaufverfolgungsereignisse hinzuzufügen und die Ablaufverfolgungsereignisse an IIS weiterzuleiten. Die folgende Zeile unter den using-Anweisungen hinzufügen:
using System.Diagnostics;
Es muss ein TraceSource im Code erstellt werden – beachten Sie die Definition der traceSource innerhalb der Deklaration des IIS_MOD_REQDATA Moduls:
public class IIS_MOD_REQDATA : IHttpModule
{
TraceSource tsStatus;
Das Mitglied tsStatus wird während der Init()-Methode von IHttpModule initialisiert:
public void Init(HttpApplication application)
{
application.EndRequest += (new EventHandler(this.Application_EndRequest));
// setup traceSource
tsStatus = new TraceSource("tsStatus");
}
Der Name des TraceSource ("tsStatus") ist wichtig, da später in der Datei "web.config" auf diesen Namen verwiesen wird. Das Modul ist nun so eingerichtet, dass bei Bedarf Ereignisse ausgegeben werden.
Um ein neues Ablaufverfolgungsereignis hinzuzufügen, verwenden Sie tsStatus.TraceEvent(<Typ>, 0, <beliebigertring>), um Ereignisse zu schreiben. Die empfohlenen Start- und End-Ereignisse zur Application_EndRequest()- Methode hinzufügen:
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");
}
Beachten Sie die unterschiedlichen <Typen>– die unterstützt werden, u.a.:
- TraceEventType.Start
- TraceEventType.Stop
- TraceEventType.Error
- TraceEventType.Warning
- TraceEventType.Information
- TraceEventType.Verbose
Zur Vollständigkeit kann die gesamte Quelle für das Modul (einschließlich der Ablaufverfolgungsereignisse) von hier aus kopiert werden:
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()
{
}
}
}
Schritt 3: Unseres Ablaufverfolgungsmodul kompilieren
Jetzt das Modul kompilieren und bereitstellen. Den folgenden Befehl an einer Administrator-Eingabeaufforderung eingeben:
%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
Hinweis
Bei Ausführung auf einem 64bit System, kompilieren Sie den 64bit C#-Compiler in %windir%\microsoft.net\framework64\v2.0.50727\csc.exe
Beachten Sie die Verwendung der Schalter /debug & /d:TRACE. Diese Schalter müssen verwendet werden, um die Ablaufverfolgungsereignisse in die Binärdatei zu kompilieren. Werden sie nicht mit diesen Switches kompiliert, hat dies zur Folge, dass das Modul keine Ablaufverfolgungsereignisse enthält.
Nachdem Sie das Modul kompiliert haben, stellen Sie es bereit und führen einen ersten Test durch, um zu sehen, ob das Modul funktioniert, bevor Sie seine Spuren aufzeichnen.
Module zur Standortkonfiguration hinzufügen
Dieser Abschnitt beinhaltet das Hinzufügen und Testen des Moduls.
Schritt 1: Das Modul zur Standortkonfiguration hinzufügen
- Erstellen Sie über dieselbe Administrator-Eingabeaufforderung ein Verzeichnis namens \inetpub\wwwroot\bin, und kopieren Sie dann IIS_MOD_REQDATA.dll in dieses Verzeichnis.
- Aktivieren Sie das Modul. Geben Sie an der Administrator-Eingabeaufforderung start inetmgr ein, um die IIS Verwaltungs-UI anzuzeigen.
- Erweitern Sie im Fenster Verbindungen den Namen des lokalen Computers, dann Websites, und klicken Sie auf Standardwebsite".
- Doppelklicken Sie unter IIS im mittleren Fenster auf Module:
- Es wird eine lange Liste von Modulen angezeigt, die für die Verwendung durch diese Website konfiguriert sind. Klicken Sie auf der rechten Seite der Benutzeroberfläche unter Aktionen auf Verwaltetes Modul hinzufügen:
- Geben im angezeigten Fenster dem verwalteten Modul den Namen IIS_MOD_REQDATA, und der Typ des Moduls ist IIS_MOD_REQDATA.IIS_MOD_REQDATA (wählen Sie dies im Dropdown-Listenfeld):
- Klicken Sie auf OK. Das neu nachverfolgte Modul ist jetzt zur Verwendung der Website konfiguriert.
Schritt 2: Unser Modul testen
Testen Sie das Modul, indem Sie den Internet Explorer öffnen und zu http://localhost/test.htm
navigieren. Das folgende Fenster wird erscheint:
Der Inhalt "REQUEST HEADERS" & "RESPONSE HEADERS" stammt aus unserem Modul, wodurch zu erkennen ist, dass funktioniert.
Weiterleitung von Ereignissen an IIS
Diese Aufgabe verbindet die TraceSource des Moduls mit dem IIS-Tracing, so dass die Ereignisse über IIS ausgegeben werden, und konfiguriert dann das Failure Request Tracing zur Erfassung dieser Trace-Ereignisse.
Schritt 1: Aktivieren des Moduls TraceSource und Weiterleiten seiner Ereignisse in den IIS
Das Modul wird aktualisiert, um Ablaufverfolgungsereignisse einzubeziehen. Konfigurieren Sie System.Diagnostics und IIS so, dass diese Ablaufverfolgungs-Ereignisse erfasst und in das IIS-Modul zur Verfolgung fehlgeschlagener Anfragen geleitet werden. Konfigurieren Sie dazu den Abschnitt <system.diagnostics> in der Datei web.config, um die TraceSource einzurichten und ihre Ereignisse entsprechend weiterzuleiten.
Navigieren Sie mit der Administrator-Eingabeaufforderung zu
c:\inetpub\wwwroot
, und verwenden Sie Notepad, um Ihre Datei web.config zu bearbeiten.Es gibt 3 Teile der Konfiguration, die abgeschlossen werden müssen, um die vom Modul ausgegebenen Ereignisse abzurufen, die an die Ablaufverfolgungsinfrastruktur von IIS weitergeleitet werden:
- Den IIS-Ereignis traceListener als gemeinsamen Listener definieren
- Einen Schalters zur Aktivierung aller Ereignisse definieren
- Die Verfolgungs-Quelle definieren, den von uns definierten Schalter anhängen, und den Trace-Listener für unsere Quelle definieren.
IIS liefert einen neuen System.Diagnostics.TraceListener, der zum Weiterleiten von TraceSource-Ereignissen in die Ablaufverfolgungsinfrastruktur von IIS benutzt wird. Dieser Anbieter muss auch in Der Datei web.config definiert werden.
Definieren Sie die traceSource anhand ihres Namens (tsStatus), und verknüpfen Sie sie mit dem DefaultSwitch & IisTraceListener.
Kopieren Sie diesen Abschnitt <system.Diagnostics> und fügen Sie ihn in Ihre web.config-Datei ein (nach Ihrem Abschnitt
<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>
Die tsStatus traceSource wird mit IIS7TraceListener verbunden, wodurch Ereignisse in die IIS-Ablaufverfolgungsinfrastruktur ausgegeben werden. Mit dem nächsten Schritt fortfahren, um diese Ereignisse mit dem Anbieter für fehlgeschlagene Anforderungsablaufverfolgung zu verbinden.
Schritt 2: Die Fehleranforderungsablaufverfolgung zum Erfassen von Modulablaufverfolgungsereignissen aktivieren
Wenn diese Diagnoseereignisse in die Ablaufverfolgungsinfrastruktur von IIS ausgegeben werden, werden sie dem ASP.net Provider und dem Modul-Flag für diesen Anbieter zugewiesen. Ihre Ausführlichkeit ist von der verwendeten TraceEventType abhängig. So konfigurieren Sie die Verfolgung fehlgeschlagener Anfragen, um diese zu erfassen:
Geben Sie an der Administrator-Eingabeaufforderung start inetmgr ein. Erweitern Sie im Fenster Verbindungen den Computernamen, dann den Website-Ordner, und klicken Sie dann auf die Standardwebsite. Klicken Sie auf der rechten Seit unter dem Fenster Aktionen auf den Link Ablaufverfolgung fehlgeschlagener Anforderungen... unter Konfigurieren:
Ticken Sie das Kontrollkästchen Aktivieren. Die Standardwerte für die anderen Einstellungen beibehalten. Klicken Sie zum Fortsetzen des Vorgangs auf OK .
Nachdem wir nun überprüft haben, dass die Protokollierung der Fehleranforderungsablaufverfolgung aktiviert ist, müssen wir als Nächste die Fehlerdefinitionen konfigurieren. Zurück im IIS-Manager doppelklicken Sie unter IIS auf Fehleranforderungsablaufverfolgungs-Regeln
Klicken Sie im Fenster Aktionen auf Hinzufügen.... Dadurch wird der Assistent Regel zur Ablaufverfolgung von Fehlgeschlagenen Anforderungen zufügen gestartet.
Wählen Sie auf der Seite Inhalt für Ablaufverfolgung angeben die Option Alle Inhalte (*), um zu ermitteln, was verfolgt werden soll. Klicken Sie auf Weiter.
Ticken Sie im Bildschirm Ablaufverfolgungsbedingungen definieren das Kontrollkästchen Statuscodes, und geben Sie "200" als zu verfolgenden Statuscode ein.
Klicken Sie auf Weiter. Die Seite Ablaufverfolgungsanbieter wählen wird angezeigt. Aktivieren Sie das Kontrollkästchen ASPNET und die Kontrollkästchen Modul & Seite unter "Bereiche". Wählen Sie unter Ausführlichkeit die Option Ausführlich.
Hinweis
Aufgrund eines Fehlers in Server Beta 3-Builds können Modulablaufverfolgungen nur erfasst werden, wenn sowohl Modul- als auch Seitenbereiche gewählt sind. Im Post Server Beta 3 ist nur Modul erforderlich, um diese Ereignisse zu erfassen.
Klicken Sie auf Fertig stellen. Die folgende Definition für die Standardwebsite wird gezeigt:
Ergebnisse testen und anzeigen
In dieser Aufgabe generieren wir die fehlgeschlagene Anforderung und sehen uns das resultierende Ablaufverfolgungsprotokoll an. Bedenken Sie, dass IIS so konfiguriert wurde, dass Ablaufverfolgungsprotokolle für http://localhost/* Anforderungen erfasst werden, die mit einer 200 fehlschlagen. Um zu prüfen, ob es funktioniert hat:
- Ein neues Internet Explorer-Fenster öffnen. Die Adresse
http://localhost/test.htm
eingeben. Auch hier sieht man Folgendes:
- Um zu prüfen, ob unser Modul erfasste Ablaufverfolgungen generiert hat, verwenden Sie ein Fenster mit auf Administrator erhöhten Rechten im Internet Explorer, und drücken Sie STRG-O, und navigieren Sie zu
c:\inetpub\logs\FailedReqLogFiles\W3SVC1
. Wählen Sie im Dropdownlisten-Feld HTML-DateienAlle Dateien. - Wählen Sie die neueste fr######.xml Datei (heutiges Datum), und klicken Sie auf Öffnen. Es werden die Ereignisse angezeigt:
Zusammenfassung
Sie haben ein neues Ablaufverfolgungsereignis zu einem verwalteten Modul hinzugefügt, dieses Modul kompiliert und bereitgestellt, System.Diagnostics so konfiguriert, dass es seine Ereignisse an die Ablaufverfolgungsinfrastruktur von IIS weiterleitet und schließlich das Feature "Fehleranforderungsablaufverfolgung" von IIS so konfiguriert, dass seine Ereignisse erfasst werden. Sie können dem Modul jetzt bequem neue Ereignisse hinzufügen und dann das Modul neu kompilieren und es im Verzeichnis "\bin" bereitstellen. Wenn die Ablaufverfolgung fehlgeschlagener Anforderungen verwendet wird, werden die Ergebnisse der Ereignisse angezeigt.
Denken Sie daran, dass Sie bei Verwendung von System.Diagnostics.TraceSource Ihr Modul und seine Trace-Ereignisse weiterhin auf der unteren Ebene verwenden können, sofern Sie es an einen anderen Trace-Listener anschließen.