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:

  1. Klicken Sie auf die Schaltfläche "Start" -> Alle Programme -> Zubehör -> (R-Klick)-Eingabeaufforderung -> Als Administrator ausführen
    Screenshot of the Windows Start menu with a focus on the Run as administrator option in the right-click drop-down menu.

  2. Den folgenden Befehl an dieser Eingabeaufforderung ausführen:

    %windir%\system32\inetsrv\appcmd add backup
    

Schritt 4: Beispielinhalte erstellen

  1. Alles im c:\inetpub\wwwroot Ordner löschen.
  2. 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

Screenshot of the exclamation code dash consoleMain command in Notepad.

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

  1. Erstellen Sie über dieselbe Administrator-Eingabeaufforderung ein Verzeichnis namens \inetpub\wwwroot\bin, und kopieren Sie dann IIS_MOD_REQDATA.dll in dieses Verzeichnis.
  2. Aktivieren Sie das Modul. Geben Sie an der Administrator-Eingabeaufforderung start inetmgr ein, um die IIS Verwaltungs-UI anzuzeigen.
  3. Erweitern Sie im Fenster Verbindungen den Namen des lokalen Computers, dann Websites, und klicken Sie auf Standardwebsite".
  4. Doppelklicken Sie unter IIS im mittleren Fenster auf Module:
    Screenshot of the Default Web Site Home screen with the Modules option being highlighted.
  5. 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:
    Screenshot of the Actions pane with a focus on the Add Managed Module option.
  6. 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):
    Screenshot of the Add Managed Module dialog box, showing the Name and Type fields.
  7. Klicken Sie auf OK. Das neu nachverfolgte Modul ist jetzt zur Verwendung der Website konfiguriert.
    Screenshot of the Modules screen, showing the newly traced module.

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:

Screenshot of a webpage reading here is a sample page that is served by static file handler.

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.

  1. Navigieren Sie mit der Administrator-Eingabeaufforderung zu c:\inetpub\wwwroot, und verwenden Sie Notepad, um Ihre Datei web.config zu bearbeiten.

  2. 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.
  3. 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.

  4. Definieren Sie die traceSource anhand ihres Namens (tsStatus), und verknüpfen Sie sie mit dem DefaultSwitch & IisTraceListener.

  5. 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:

  1. 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:
    Screenshot of the Manage Web Site section of the Actions pane, with the Failed Request Tracing option being highlighted.

  2. Im nächsten Dialogfeld Folgendes konfigurieren:
    Screenshot of the Edit Web Site Failed Request Tracing Settings dialog box.

  3. Ticken Sie das Kontrollkästchen Aktivieren. Die Standardwerte für die anderen Einstellungen beibehalten. Klicken Sie zum Fortsetzen des Vorgangs auf OK .

  4. 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
    Screenshot of the Default Web Site Home screen with the Failed Request Tracing Rules option being highlighted.

  5. Klicken Sie im Fenster Aktionen auf Hinzufügen.... Dadurch wird der Assistent Regel zur Ablaufverfolgung von Fehlgeschlagenen Anforderungen zufügen gestartet.

  6. 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.
    Screenshot of the Add Failed Request Tracing Rule page with a focus on the Next option.

  7. Ticken Sie im Bildschirm Ablaufverfolgungsbedingungen definieren das Kontrollkästchen Statuscodes, und geben Sie "200" als zu verfolgenden Statuscode ein.
    Screenshot of the Define Trace Conditions screen with the Status codes field being checked.

  8. 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.
    Screenshot of the Select Trace Providers screen with the ASPNET Provider option being highlighted.

    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.

  9. Klicken Sie auf Fertig stellen. Die folgende Definition für die Standardwebsite wird gezeigt:
    Screenshot of the Failed Request Tracing Rules screen.

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:

  1. Ein neues Internet Explorer-Fenster öffnen. Die Adresse http://localhost/test.htm eingeben. Auch hier sieht man Folgendes:
    Screenshot of the sample webpage in an Internet Explorer window.
  2. 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.
  3. Wählen Sie die neueste fr######.xml Datei (heutiges Datum), und klicken Sie auf Öffnen. Es werden die Ereignisse angezeigt:
    Screenshot of the Request Diagnostics screen, showing the Custom Module Traces tab.

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.