Trasování

 

Rob Howard
Microsoft Corporation

úterý 25. ledna 2001

Kdykoliv předvedu prezentaci na ASP.NET, je vždy zábavné watch posluchače, když se ukáže nová funkce trasování. Pro ty z nás, kteří vytvořili řešení s ASP, je trasování darem z nebes!

Ve sloupci tohoto měsíce se podíváme na funkci trasování v ASP.NET. Začněme tím, že si probereme běžnou techniku trasování pro ASP, Response.Write().

Trasování pomocí ASP

Pokud jste jako já, při kódování aplikace ASP použijete příkazy Response.Write(), když pitváte problematickou část kódu.

Tady je pseudokód, který tento bod ilustruje:

<%
On Error Resume Next 
Response.Write("About to do data access...")
Set objDB = Server.CreateObject("Custom.DataAccess")
objDB.Open("PersonalizationData")
user = objDB.Get("username")
Response.Write("Done calling data access. Value of username is:" + user)
%>

Volání Response.Write() ve výše uvedeném kódu by měla vypadat docela povědomě, tj. došlo k chybě s chováním našeho kódu. Tato chyba nemusí nutně být chybou aplikace nebo systému, například selháním načtení objektu, ale spíše chybou kódování, při které se kód spustí podle očekávání, ale nevrací očekávanou hodnotu.

Samozřejmě můžeme použít také ladicí program, ale někdy je prostě rychlejší získat výstup trasování, abychom zjistili, co kód dělá, nebo nám jednoduše dejte vědět, jak se provádí konkrétní část kódu.

I když příkazy Repsonse.Write() usnadňují rychlé ladění aplikace, vnáší do aplikace zbytečný kód, který může vést ke skutečným chybám, které naruší nasazené aplikace. Obecně se například nepovažuje za dobrou věc, když zapomeneme odebrat barevnější příkaz Response.Write(), který by mohl vyjádřit naše skutečné pocity ohledně kódu, na kterém pracujeme.

V rámci ASP.NET se samozřejmě podporují stejné funkce jako příkazy Response.Write(). Ve skutečnosti stále používám Response.Write(), i když teď máme funkci trasování. Staré návyky je těžké zlomit.

Všichni bychom se ale měli pokusit tyto staré zvyky porušit, protože nová funkce trasování nám dává něco, co v režimu ladění ASP neexistovalo.

Trasování pomocí ASP.NET

Nové funkce trasování ASP.NET nám umožňují simulovat příkazy Response.Write(), ale nemusíte se starat o odebrání příkazů před nasazením našich aplikací. Místo toho si představte, že napíšeme stejný kód jako výše, ale místo použití Response.Write() použijeme Trace.Write().

Objekt Trace je nyní vnitřní objekt stránky, podobně jako Request, Response, Server atd. Je přístupný přímo s naším kódem stránky.

Pojďme se krátce podívat na třídu Trace .

Trace – třída

Trasování je vystaveno jako veřejná vlastnost v rámci ASP.NET stránek. Při použití trace vlastnost pracujeme s instancí TraceContext třídy definované v oboru názvů System.Web .

Trace Třída zveřejňuje dvě přetížené metody a dvě vlastnosti. Obě metody Warn() a Write(), obě podporují dva identické prototypy:

VB.NET

Public Sub [Warn | Write](category As String, 
                          message As String, 
                          errorInfo As Exception)
End Sub
Public Sub [Warn | Write](category As String, 
                          message As String)
End Sub

C#

public void [Warn | Write](String category, 
                           String message, 
                           Exception errorInfo)
public void [Warn | Write](String category, 
                           String message)

Parametr category se používá k identifikaci názvu kategorie pro zápis hodnoty zprávy . To se projeví, když v následujícím příkladu použijeme metodu Write(). Třetí parametr, který warn() i Write() podporují ve svých přetížených metodách, je errorInfo. To nám umožňuje předat podrobnosti o výjimce do systému trasování.

Vlastnosti

Třída TraceContext podporuje dvě veřejné vlastnosti: IsEnabled a TraceMode.

  • IsEnabled označuje, jestli je na stránce nebo pro aplikaci povolené trasování.
  • TraceMode nastaví nebo vrátí režim řazení, který trasování používá. Na konfiguraci režimu trasování se podíváme, když si probereme trasování na úrovni aplikace níže.

Teď, když jsme viděli, jak třída a metody a vlastnosti podporované TraceContext třídy vypadají, pojďme se podívat na příklad Trace.Write().

<Script runat=server>
Public Function Add(a As Integer, b As Integer) As Integer
  Trace.Write("Inside Add() a: ", a.ToString())
  Trace.Write("Inside Add() b: ", b.ToString())
  return a + b
End Function
</Script>
Call the Add routine: 4 + 5 = <%=Add(4,5)%>

Při spuštění tohoto kódu je výstup:

Obrázek 1: Příklad metody Trace.Write()

Je zřejmé, že je volána metoda Add( ). Na rozdíl od příkazů Repsonse.Write() se však příkazy Trace.Write() nezobrazí ve výsledném výstupu. Pokud chcete zobrazit výsledky příkazů Trace.Write(), musíme povolit trasování pro tuto stránku nebo pro aplikaci.

K povolení trasování můžeme použít buď direktivu stránky, nebo možnost konfigurace. Pojďme se podívat na obojí.

Direktiva trasování stránek

Direktivy stránky jsou speciální pokyny, které ASP.NET používat při zpracování žádosti o ASP.NET prostředek. Direktivy stránky lze použít k přepsání nebo použití nastavení konfigurace pro ASP.NET stránku.

Direktiva musí být prvním prvkem na stránce. Deklaruje se pomocí následující syntaxe:

<%@ Directive Attribute="[Value]" %>

Pomocí výše uvedené syntaxe zjistíme, jak ASP.NET, že chceme na stránce povolit trasování:

<%@ Page Trace="true" %>

Pokud do ukázkového kódu přidáme výše uvedenou direktivu, bude výstup stránky vypadat trochu jinak:

Obrázek 2. Trasování povoleno

Teď dostáváme výstup trasování přidaný do dolní části stránky. Výstup trasování se vždy přidá na konec stránky.

Dále se podíváme, jak povolíme trasování na úrovni aplikace. Pak probereme, co výstup trasování obsahuje.

Trasování aplikací

ASP.NET používá konfigurační soubory XML k nastavení konfigurace pro ASP.NET aplikace. Každá instalace ASP.NET nainstaluje konfigurační soubor do adresáře [systémová jednotka]\WinNt\Microsoft.NET\Framework\[verze]\s názvem config.web.

Konfigurační soubor nastaví výchozí konfiguraci ASP.NET a v beta verzi 1 se označuje jako kořenový konfigurační soubor. Změny provedené v tomto souboru ovlivní všechny webové aplikace ASP.NET. Konfigurační soubory ve webových aplikacích můžeme také použít k přidání nebo odebrání nastavení získaných z výchozího souboru config.web.

Konfiguraci podrobněji probereme v dalším sloupci. Prozatím použijeme kořenový konfigurační soubor k použití nastavení trasování pro všechny aplikace ASP.NET.

Oddíl trasování

Pokud otevřeme kořenový soubor config.web , najdeme část trasování:

<configuration>
    <trace
        enabled="false"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

Pro element trace existují čtyři atributy:

  • enabled = [true/false]" – Povolenou možnost můžeme nastavit na true nebo false. Trasování je povolené na úrovni aplikace nebo je zakázané na úrovni aplikace. Pokud nastavíme enabled=false, trasování stránek se stále podporuje pomocí direktivy Trace probírané výše.
  • requestlimit = " [int]"– Celkový počet žádostí o trasování, které se mají uchovávat v mezipaměti v paměti na základě jednotlivých aplikací. Trasování zveřejňuje speciální prostředek – Trace.axd, na který se podíváme na chvíli – který se používá k zobrazení výstupu trasování, když je pageoutput nastavený na false.
  • pageoutput = " [true/false]"– Pokud je trasování povolené prostřednictvím konfiguračního souboru, může správce trasování povolit nebo zakázat na každé stránce. Trasování pageoutput umožňuje trasování podrobností pro každou stránku v aplikaci. Trasování pageoutput však může být vypnuté, pokud je trasování na úrovni aplikace stále povolené (povoleno = "true"). Požadavky na trasování se tak zachovají v paměti, aby byly dostupné prostřednictvím trace.axd, na které se podíváme na chvíli, ale nezobrazují se ve výstupu stránky.
  • tracemode = "[SortByTime | SortByCategory]"– Nastavení tracemode nám dává kontrolu nad výstupem informací o podrobnostech trasování. Data mohou být seřazena podle času nebo kategorie, kde kategorie se rozlišuje mezi nastavením systémem a nastavením Trace.Write() povoleným vývojářem. Například v naší ukázce jsme použili následující: Trace.Write("Inside Add()a :", a.ToString()). První parametr příkazu Trace.Write() je kategorie. V tomto případě jsme kategorii definovali jako "Inside Add() a:". Pokud bychom seřadili podle kategorie (tracemode = "SortByCategory"), byla by tato položka seřazena před voláním normální funkce stránky ve výstupu trasování. Řazení podle času se naopak seřadí podle doby strávené během hovoru.

Použití trasování aplikací

Pomocí stejného ukázkového kódu výše bychom mohli odebrat direktivu stránky a povolit stejnou funkci úpravou nastavení trasování config.web .

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="true"
        tracemode="SortByTime"
    />
</configuration>

Teď můžeme zavolat ukázkovou aplikaci, odebrat direktivu Page a získat stejný výstup:

Obrázek 3: Trasování povoleno, žádná direktiva Page

Ale co když chceme použít funkci uvedenou výše, ve které povolíme trasování, ale zakážeme výstup na stránce?

<configuration>
    <trace
        enabled="true"
        requestlimit="10"
        pageoutput="false"
        tracemode="SortByTime"
    />
</configuration>

Pokud bychom požadovali ukázkovou aplikaci s výše uvedeným nastavením konfigurace, nezískáme žádný výstup trasování, i když je trasování stále povolené. K zobrazení výstupu trasování používáme speciální aplikaci s názvem trace.axd.

Trace.axd

Trace.axd je obslužná rutina http. Obslužná rutina HTTP je možnost kódování, která nám umožňuje zpracovávat požadavky a odpovědi na nejzákladnější úrovni. Obslužné rutiny HTTP jsou ekvivalentem rozšíření ISAPI. Na rozdíl od ROZHRANÍ ISAPI je ale možné je vytvořit pomocí libovolného jazyka .NET. Obslužné rutiny HTTP probereme podrobněji v pozdějším sloupci.

Trace.axd je obslužná rutina HTTP, kterou můžeme použít k vyžádání podrobností o trasování aplikace. Na vyžádání dostaneme protokol trasování posledních n požadavků; n je určen hodnotou nastavenou parametrem requestlimit="[int]" v našem konfiguračním souboru.

Pokud chcete použít trace.axd, jednoduše vyžádejte trace.axd ve stejném adresáři aplikace, ve které byl proveden požadavek na ukázkovou aplikaci:

Obrázek 4. Žádosti o trasování aplikací

Jak je vidět na snímku obrazovky, zobrazí se nám seznam trasování, která můžeme zobrazit. Tato zobrazení trasování jsou shodná s podrobnostmi, které by trasování přidalo na stránku bez zahrnutí výstupu ze stránky:

Obrázek 5. Podrobnosti o požadavku

Teď, když jsme si prošli postup konfigurace a použití trasování, probereme výstup trasování.

Interpretace výstupu trasování

Výstup poskytovaný zobrazením trasování, buď prostřednictvím Trace.axd, nebo na stránce, obsahuje šest částí podrobností:

  • Podrobnosti žádosti – jedná se o základní informace, jako je ID relace, čas požadavku, typ požadavku HTTP a stavový kód odpovědi HTTP.
  • Informace o trasování – Tato část obsahuje tabulkové zobrazení kategorií a zpráv. Pokud v našem kódu použijeme příkazy Trace.Write(), jako hodnoty Category a Message se použijí dva parametry, které Trace.Write() přijímá. Navíc máme k dispozici čas od prvního do posledního bajtu.
  • Řídicí strom – i když to ještě není v tomto sloupci popsáno, ASP.NET používá serverové ovládací prvky, které nám umožňují deklarativně sestavovat aplikace. Oddíl Řídicí strom poskytuje informace o ovládacích prvcích na naší stránce. K dispozici je ID, typ, velikost vykreslení a velikost stavu zobrazení ovládacího prvku. Tyto informace nám poskytují představu o tom, které ovládací prvky používáme, a také o souvisejících nákladech (velikost vykreslování a stav zobrazení).
  • Shromažďování souborů cookie – všechny soubory cookie, které klient odešle v hlavičce požadavku, se analyzují a zobrazí se jejich názvy, hodnoty a velikosti.
  • Kolekce hlaviček – hlavičky HTTP, které klient předá serveru, jsou uvedené v této části. Jedná se o jednoduchou tabulku se seznamem Název/Hodnota.
  • Proměnné serveru – část proměnných serveru obsahuje tabulku párů název-hodnota s proměnnými serveru.

Použití trasování

Jak jasně vidíte, trasování je nová výkonná funkce ASP.NET navržená tak, aby usnadnila vývoj webových aplikací. Myslel jsem si však, že by také bylo vhodné zmínit, kdy byste měli a neměli používat trasování.

Nasazené aplikace

Trasování zvyšuje režii požadavků a nemělo by být povolené pro nasazené aplikace. Příkazy Trace.Write() však mohou být ponechány v souboru, protože jsou ignorovány, pokud není povoleno trasování.

Pro nasazené aplikace, ve kterých chceme zachytávat data, doporučujeme použít třídy, které najdete v oboru názvů System.Diagnostics . Tyto třídy, které se pokusím pokrýt v budoucím sloupci, nám umožňují zapisovat přímo do protokolu událostí Windows.

Trasování bychom měli určitě použít při vytváření aplikace, ale zakázat ho, až budeme připraveni aplikaci nasadit, stejně jako bychom odebrali příkazy Response.Write().

Zakázání trace.axd

Pokud jste nainstalovali ASP.NET na produkční webový server, doporučuji explicitně zakázat Trace.axd. Otevřete kořenový soubor config.web , vyhledejte <httphandlers> oddíl a přidejte následující položku:

<configuration>
        <add verb="*" 
             path="trace.axd"
             type="System.Web.Handlers.TraceHandler" />
        <remove verb="*" path="trace.axd"/>
</configuration>

Poznámka: Mohli bychom také vyjmout celou <add/> položku, ale <remove> možnost je lepší, protože ponechá kód v našem konfiguračním souboru a dosáhne stejného cíle a zakáže trasování.axd. Tento problém se vyřeší v beta verzi 2 ASP.NET.

Souhrn

Funkce trasování v ASP.NET představuje nový výkonný způsob, jak sledovat, co naše aplikace dělá. V minulosti jsme použili příkazy Response.Write() ke sledování naší aplikace při jejím spuštění, ale teď můžeme použít příkazy Trace.Write() a tyto příkazy ponechat v našem nasazeném kódu. To vede k menšímu počtu chyb, protože neodebrali kód, když jsme připraveni nasadit aplikaci.

ASP.NET zdroje

Nakonec jsme chtěli volat některé nové ASP.NET prostředky, které jsou k dispozici. Další informace o ASP.NET zdrojích informací najdete na stránce https://www.asp.net .

Rob Howard je programový manažer pro ASP.NET v týmu rozhraní .NET Framework. Ve východním Washingtonu tráví jakýkoli volný čas, ať už se svou rodinou, nebo muškařením.