Śledzenie
Rob Howard
Microsoft Corporation
25 stycznia 2001 r.
Zawsze, gdy wygłaszam prezentację na ASP.NET, zawsze warto watch odbiorców po zademonstrowaniu nowych funkcji śledzenia. Dla tych z nas, którzy zbudowali rozwiązania za pomocą asp, śledzenie jest godsend!
W kolumnie w tym miesiącu przyjrzymy się funkcji śledzenia w ASP.NET. Zacznijmy od omówienia typowej techniki śledzenia dla platformy ASP, Response.Write().
Śledzenie za pomocą platformy ASP
Jeśli jesteś jak ja, gdy kodujesz aplikację ASP, używasz instrukcji Response.Write() podczas usuwania kłopotliwej sekcji kodu.
Oto przykładowy kod ilustrowany tym punktem:
<%
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)
%>
Wywołania Response.Write() w powyższym kodzie powinny wyglądać dość znajomo, tj. wystąpił błąd z zachowaniem naszego kodu. Błąd nie musi być błędem aplikacji lub systemu, takim jak błąd ładowania obiektu, ale raczej błąd kodowania, w którym kod jest wykonywany zgodnie z oczekiwaniami, ale nie zwraca oczekiwanej wartości.
Oczywiście możemy również użyć debugera, ale czasami jest to po prostu szybsze, aby uzyskać dane wyjściowe śledzenia, aby dowiedzieć się, co robi kod, lub po prostu poinformować nas, jak jest wykonywana konkretna sekcja kodu.
Mimo że instrukcje Repsonse.Write() ułatwiają szybkie debugowanie aplikacji, wprowadzają one niepotrzebny kod do aplikacji, co może powodować rzeczywiste błędy, które przerywają wdrażanie aplikacji. Na przykład zwykle nie jest to dobre rozwiązanie, gdy zapomnimy usunąć bardziej kolorową instrukcję Response.Write(), która może wyrazić nasze prawdziwe uczucia dotyczące kodu, nad którym pracujemy.
Oczywiście ta sama funkcja instrukcji Response.Write() jest obsługiwana w ASP.NET. W rzeczywistości nadal uważam się za pomocą funkcji Response.Write(), mimo że teraz mamy funkcję śledzenia. Stare nawyki są trudne do złamania.
Jednak wszyscy powinniśmy spróbować przerwać te stare nawyki, ponieważ nowa funkcja śledzenia daje nam coś, co nie istniało w trybie debugowania ASP: .
Śledzenie za pomocą ASP.NET
Nowe funkcje śledzenia ASP.NET umożliwiają symulowanie instrukcji Response.Write(), ale nie martw się o usunięcie instrukcji przed wdrożeniem naszych aplikacji. Zamiast tego wyobraź sobie, że pisać ten sam kod co powyżej, ale zamiast używać metody Response.Write(), używamy metody Trace.Write().
Obiekt Trace jest teraz obiektem wewnętrznej strony, podobnie jak żądanie, odpowiedź, serwer itp. Jest on dostępny bezpośrednio za pomocą naszego kodu strony.
Przyjrzyjmy się krótko klasie Trace .
Trace, klasa
Śledzenie jest widoczne jako właściwość publiczna na ASP.NET stronach. Gdy używamy właściwości Trace , pracujemy z wystąpieniem klasy TraceContext zdefiniowanej w przestrzeni nazw System.Web .
Klasa Trace uwidacznia dwie przeciążone metody i dwie właściwości. Obie metody Warn()
Write(),
obsługują dwa identyczne 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 służy do identyfikowania nazwy kategorii w celu zapisania wartości wiadomości . Stanie się to bardziej widoczne, gdy użyjemy metody Write() w poniższym przykładzie. Trzeci parametr, który obsługuje metody Warn() i Write() w ich przeciążonych metodach, to errorInfo. Dzięki temu możemy przekazać szczegóły wyjątku do systemu śledzenia.
Właściwości
Klasa TraceContext obsługuje dwie właściwości publiczne: IsEnabled i TraceMode.
- IsEnabled wskazuje, czy śledzenie jest włączone na stronie, czy dla aplikacji.
- TraceMode ustawia lub zwraca tryb sortowania używany przez śledzenie. Podczas omawiania śledzenia na poniższym poziomie aplikacji przyjrzymy się konfigurowaniu trybu śledzenia.
Teraz, gdy zobaczyliśmy, jak wygląda klasa oraz metody i właściwości obsługiwane przez klasę TraceContext , przyjrzyjmy się przykładowi metody 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)%>
Po uruchomieniu tego kodu dane wyjściowe to:
Rysunek 1. Przykład metody Trace.Write()
Oczywiście wywoływana jest metoda Add( ). Jednak w przeciwieństwie do instrukcji Repsonse.Write() instrukcje Trace.Write() nie są wyświetlane w wynikowych danych wyjściowych. Aby wyświetlić wyniki instrukcji Trace.Write(), musimy włączyć śledzenie dla tej strony lub dla aplikacji.
Aby włączyć śledzenie, możemy użyć dyrektywy page lub opcji konfiguracji. Przyjrzyjmy się obu tym.
Page Trace, dyrektywa
Dyrektywy strony to specjalne instrukcje, które ASP.NET używać podczas przetwarzania żądania dla zasobu ASP.NET. Dyrektywy strony mogą służyć do zastępowania lub stosowania ustawień konfiguracji dla strony ASP.NET.
Dyrektywa musi być pierwszym elementem na stronie. Jest zadeklarowany przy użyciu następującej składni:
<%@ Directive Attribute="[Value]" %>
Korzystając z powyższej składni, poniżej przedstawiono sposób, w jaki informujemy ASP.NET, że śledzenie ma być włączone na stronie:
<%@ Page Trace="true" %>
Jeśli dodamy powyższą dyrektywę do naszego przykładowego kodu, dane wyjściowe strony wyglądają nieco inaczej:
Rysunek 2. Śledzenie włączone
Teraz dane wyjściowe śledzenia są dodawane do dołu strony. Dane wyjściowe śledzenia są zawsze dodawane na końcu strony.
Następnie zobaczmy, jak włączamy śledzenie na poziomie aplikacji. Następnie omówimy dane wyjściowe śledzenia.
Śledzenie aplikacji
ASP.NET używa plików konfiguracji XML do ustawiania ustawień konfiguracji dla aplikacji ASP.NET. Każda instalacja ASP.NET instaluje plik konfiguracji w katalogu [dysk systemowy]\WinNt\Microsoft.NET\Framework\[wersja]\ katalogu o nazwie config.web.
Plik konfiguracji ustawia domyślną konfigurację ASP.NET, a w wersji Beta 1 jest znany jako główny plik konfiguracji. Zmiany wprowadzone w tym pliku mają wpływ na całą naszą aplikację internetową ASP.NET. Możemy również użyć plików konfiguracji w naszych aplikacjach internetowych, aby dodać lub usunąć ustawienia pozyskane z domyślnego pliku config.web.
Bardziej szczegółowo omówię konfigurację w przyszłej kolumnie. Na razie użyjemy głównego pliku konfiguracji, aby zastosować ustawienia śledzenia dla wszystkich aplikacji ASP.NET.
Sekcja śledzenia
Jeśli otworzymy główny plik config.web , znajdziemy sekcję śledzenia:
<configuration>
<trace
enabled="false"
requestlimit="10"
pageoutput="false"
tracemode="SortByTime"
/>
</configuration>
Istnieją cztery atrybuty elementu śledzenia :
-
enabled = "[true/false]
"
— możemy ustawić włączoną opcję na true lub false. Śledzenie jest włączone na poziomie aplikacji lub jest wyłączone na poziomie aplikacji. Jeśli ustawimy wartość enabled=false, śledzenie stron będzie nadal obsługiwane przy użyciu dyrektywy Trace omówionej wcześniej. -
requestlimit =
"
— łączna liczba żądań śledzenia, które mają być przechowywane w pamięci podręcznej dla poszczególnych aplikacji. Śledzenie uwidacznia specjalny zasób — Trace.axd, który przyjrzymy się na chwilę — który jest używany do wyświetlania danych wyjściowych śledzenia, gdy parametr pageoutput jest ustawiony na wartość false. -
pageoutput =
"
— Po włączeniu śledzenia za pośrednictwem pliku konfiguracji administrator może włączyć lub wyłączyć śledzenie na każdej stronie. Śledzenie pageoutput umożliwia śledzenie szczegółów dla każdej strony w aplikacji. Jednak śledzenie pageoutput może być wyłączone, gdy śledzenie na poziomie aplikacji jest nadal włączone (włączone= "
true"
). Dzięki temu żądania śledzenia są dostępne w pamięci, tak aby były dostępne za pośrednictwem pliku trace.axd, które przyjrzymy się na chwilę, ale nie są wyświetlane w danych wyjściowych strony. -
tracemode
= "
[SortByTime | SortByCategory]"
— ustawienie tracemode daje nam kontrolę nad sposobem, w jaki dane wyjściowe są informacjami o szczegółach śledzenia. Dane mogą być sortowane według czasu lub kategorii, gdzie kategoria jest rozróżniana między ustawieniami wykonanymi przez system a ustawieniami Trace.Write() włączonymi przez dewelopera. Na przykład w naszym przykładzie użyliśmy następujących elementów: Trace.Write("
Inside",
a.ToString()).
Pierwszy parametr instrukcji Trace.Write() jest kategorią. W tym przypadku zdefiniowaliśmy kategorię jako"
Inside Add() a:"
. Jeśli posortowaliśmy według kategorii (tracemode = "SortByCategory"
), ten element zostanie posortowany przed wywołaniami normalnej funkcji strony w danych wyjściowych śledzenia. Z drugiej strony sortowanie według czasu jest sortowane według ilości czasu spędzonego w wywołaniu.
Korzystanie ze śledzenia aplikacji
Korzystając z powyższego przykładowego kodu, możemy usunąć dyrektywę page i włączyć tę samą funkcjonalność, modyfikując ustawienia śledzenia config.web .
<configuration>
<trace
enabled="true"
requestlimit="10"
pageoutput="true"
tracemode="SortByTime"
/>
</configuration>
Teraz możemy wywołać przykładową aplikację, usunąć dyrektywę Page i uzyskać te same dane wyjściowe:
Rysunek 3. Śledzenie włączone, brak dyrektywy Page
Ale co zrobić, jeśli chcemy użyć wymienionej wcześniej funkcji, w której włączamy śledzenie, ale wyłączamy dane wyjściowe na stronie?
<configuration>
<trace
enabled="true"
requestlimit="10"
pageoutput="false"
tracemode="SortByTime"
/>
</configuration>
Jeśli zażądaliśmy przykładowej aplikacji z powyższymi ustawieniami konfiguracji, nie uzyskamy żadnych danych wyjściowych śledzenia, chociaż śledzenie jest nadal włączone. Aby wyświetlić dane wyjściowe śledzenia, użyjemy specjalnej aplikacji o nazwie trace.axd.
Trace.axd
Trace.axd to program obsługi http. Program obsługi http to opcja kodowania, która umożliwia obsługę żądań/odpowiedzi na najbardziej podstawowym poziomie. Programy obsługi http są odpowiednikami rozszerzeń ISAPI. Jednak w przeciwieństwie do interfejsu ISAPI można je tworzyć przy użyciu dowolnego języka .NET. Bardziej szczegółowo omówię programy obsługi http w nowszej kolumnie.
Trace.axd to program obsługi http, którego możemy użyć do żądania szczegółów śledzenia aplikacji. Po zażądaniu otrzymamy dziennik śledzenia ostatnich n żądań; n jest określana przez wartość ustawioną przez requestlimit="[int]" w naszym pliku konfiguracji.
Aby użyć pliku trace.axd, po prostu zażądaj pliku trace.axd w tym samym katalogu aplikacji, który zażądał przykładowej aplikacji:
Rysunek 4. Żądania śledzenia aplikacji
Jak widać na zrzucie ekranu, przedstawiamy listę śladów, które możemy wyświetlić. Te widoki śledzenia są identyczne ze szczegółami, które zostaną dodane do strony bez danych wyjściowych strony:
Rysunek 5. Szczegóły żądania
Teraz, gdy omówiliśmy sposób konfigurowania i używania śledzenia, omówimy dane wyjściowe śledzenia.
Interpretowanie danych wyjściowych śledzenia
Dane wyjściowe udostępniane przez widok śledzenia, za pośrednictwem elementu Trace.axd lub na stronie, zawierają sześć sekcji szczegółów:
- Szczegóły żądania — są to podstawowe informacje, takie jak identyfikator sesji, czas żądania, typ żądania Http i kod stanu odpowiedzi Http.
- Informacje dotyczące śledzenia — ta sekcja zawiera widok tabeli kategorii i komunikatów. Jeśli używamy instrukcji Trace.Write() w naszym kodzie, dwa parametry akceptowane przez funkcję Trace.Write() są używane odpowiednio jako wartości Category i Message . Ponadto udostępniamy czas od pierwszego do ostatniego bajtu.
- Drzewo sterowania — chociaż nie zostało jeszcze omówione w tej kolumnie, ASP.NET używa kontrolek serwera, aby umożliwić nam deklaratywne tworzenie aplikacji. Sekcja Drzewo sterowania zawiera informacje o kontrolkach na naszej stronie. Udostępniamy identyfikator, typ, rozmiar renderowania i rozmiar stanu kontrolki. Te informacje zawierają informacje o tym, które kontrolki używamy, a także skojarzony koszt (rozmiar renderowania i stan widoku).
- Kolekcja plików cookie — wszystkie pliki cookie wysyłane przez klienta w nagłówkach żądania są analizowane, a ich nazwy, wartości i rozmiary są wyświetlane.
- Kolekcja nagłówków — nagłówki HTTP prezentowane przez klienta na serwerze są dostępne w tej sekcji. Jest to prosta tabela zawierająca listę Name/Value.
- Zmienne serwera — sekcja zmienne serwera zawiera tabelę par Name/Value zmiennych serwera.
Korzystanie z śledzenia
Jak widać wyraźnie, śledzenie jest zaawansowaną nową funkcją ASP.NET zaprojektowaną w celu ułatwienia tworzenia aplikacji internetowych. Myślałem jednak, że warto również wspomnieć, kiedy powinieneś i nie powinien używać śledzenia.
Wdrożone aplikacje
Śledzenie dodaje dodatkowe obciążenie do żądań i nie powinno być włączone dla wdrożonych aplikacji. Instrukcje Trace.Write() można jednak pozostawić, ponieważ są ignorowane, gdy śledzenie nie jest włączone.
W przypadku wdrożonych aplikacji, w których chcemy przechwycić dane, zalecam użycie klas znalezionych w przestrzeni nazw System.Diagnostics . Te klasy, które postaram się omówić w przyszłej kolumnie, pozwalają nam zapisywać bezpośrednio w dzienniku zdarzeń systemu Windows.
Zdecydowanie należy używać funkcji śledzenia podczas kompilowania aplikacji, ale wyłączać ją, gdy wszystko będzie gotowe do wdrożenia aplikacji, tak samo jak w przypadku usunięcia tych instrukcji Response.Write().
Wyłączanie funkcji Trace.axd
Jeśli zainstalowano ASP.NET na produkcyjnym serwerze sieci Web, zalecamy jawne wyłączenie funkcji Trace.axd. Otwórz główny plik config.web , znajdź sekcję <httphandlers
> i dodaj następujący wpis:
<configuration>
<add verb="*"
path="trace.axd"
type="System.Web.Handlers.TraceHandler" />
<remove verb="*" path="trace.axd"/>
</configuration>
Uwaga: Możemy również wyciąć cały <add/
> wpis, ale <remove
> opcja jest lepsza, ponieważ pozostawia kod w pliku konfiguracji i osiąga ten sam cel, wyłączając plik trace.axd. Zostanie to rozwiązane w wersji beta 2 ASP.NET.
Podsumowanie
Funkcja śledzenia w ASP.NET to zaawansowany nowy sposób śledzenia działania naszej aplikacji. W przeszłości użyliśmy instrukcji Response.Write(), aby śledzić aplikację podczas jej wykonywania, ale teraz możemy użyć instrukcji Trace.Write() i pozostawić te instrukcje we wdrożonym kodzie. Prowadzi to do mniejszej liczby usterek, ponieważ nie usuwamy kodu, gdy wszystko będzie gotowe do wdrożenia aplikacji.
zasoby ASP.NET
Wreszcie chciałem wywołać niektóre z nowych zasobów ASP.NET dostępnych. Odwiedź stronę https://www.asp.net , aby dowiedzieć się więcej o zasobach ASP.NET.
- Eraserver.net oferuje hosting dla ASP.NET.
Rob Howard jest menedżerem programu dla ASP.NET w zespole .NET Framework. Spędza wolny czas, który ma albo z rodziną, czy latać w łowieniu ryb we wschodnim Waszyngtonie.