Трассировка

 

Роб Говард
Microsoft Corporation

25 января 2001 г.

Всякий раз, когда я выдаю презентацию о ASP.NET, всегда весело watch аудитории, когда демонстрируется новая функция трассировки. Для тех из нас, кто создал решения с помощью ASP, трассировка является находкой!

В столбце этого месяца мы рассмотрим функцию трассировки в ASP.NET. Для начала рассмотрим распространенный метод трассировки для ASP Response.Write().

Трассировка с помощью ASP

Если вы похожи на меня, при коде приложения ASP вы используете операторы Response.Write() при вскрытии проблемного раздела кода.

Вот некоторый псевдокод, чтобы проиллюстрировать этот момент:

<%
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)
%>

Вызовы Response.Write() в приведенном выше коде должны выглядеть довольно знакомыми, т. е. у нас возникла ошибка с поведением нашего кода. Ошибка не обязательно является ошибкой приложения или системы, например сбоем при загрузке объекта, а скорее ошибкой кода, при которой код выполняется должным образом, но не возвращает ожидаемое значение.

Конечно, мы также можем использовать отладчик, но иногда просто быстрее получить выходные данные трассировки, чтобы узнать, что делает код, или просто сообщить нам, как выполняется определенный раздел кода.

Хотя инструкции Repsonse.Write() упрощают быструю отладку приложения, они вводят в приложение ненужный код, что может привести к реальным ошибкам, которые нарушают работу развернутых приложений. Например, обычно это не считается хорошей вещью, когда мы забываем удалить более красочный оператор Response.Write(), который может выразить наши истинные чувства о коде, над которым мы работаем.

Конечно, в ASP.NET поддерживается та же функциональность операторов Response.Write( ). На самом деле, я все еще использую Response.Write(), несмотря на то, что теперь у нас есть функция трассировки. Старые привычки трудно сломать.

Тем не менее, мы все должны попытаться нарушить эти старые привычки, потому что новая функция трассировки предоставляет нам то, чего не было в ASP: режим отладки.

Трассировка с помощью ASP.NET

Новые функции трассировки ASP.NET позволяют имитировать операторы Response.Write(), но не беспокоиться об удалении инструкций перед развертыванием приложений. Вместо этого представьте себе написание того же кода, что и выше, но вместо использования Response.Write()мы используем Trace.Write().

Объект Trace теперь является встроенным объектом страницы, похожим на запрос, ответ, сервер и т. д. Он доступен непосредственно с помощью кода страницы.

Давайте кратко рассмотрим класс Trace .

Trace - класс

Трассировка предоставляется в виде общедоступного свойства на ASP.NET страницах. При использовании свойства Trace мы работаем с экземпляром класса TraceContext , определенным в пространстве имен System.Web .

Класс Trace предоставляет два перегруженных метода и два свойства. Оба метода Warn()Write(), поддерживают два идентичных прототипа:

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)

Параметр category используется для определения имени категории, в которую нужно записать значение сообщения . Это станет более очевидным при использовании метода Write() в приведенном ниже примере. Третий параметр, который поддерживают Warn() и Write() в перегруженных методах, — errorInfo. Это позволяет передавать сведения об исключении в систему трассировки.

Свойства

Класс TraceContext поддерживает два открытых свойства: IsEnabled и TraceMode.

  • IsEnabled указывает, включена ли трассировка на странице или для приложения.
  • TraceMode задает или возвращает режим сортировки, который использует трассировка. Мы рассмотрим настройку режима трассировки, когда рассмотрим трассировку на уровне приложения ниже.

Теперь, когда мы увидели, как выглядит класс, а также методы и свойства, поддерживаемые классом TraceContext , рассмотрим пример 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)%>

При выполнении этого кода выходные данные:

Рис. 1. Пример метода Trace.Write()

Очевидно, что вызывается метод Add( ). Однако в отличие от операторов Repsonse.Write(), операторы Trace.Write() не отображаются в выходных данных. Чтобы просмотреть результаты инструкций Trace.Write(), необходимо включить трассировку для этой страницы или приложения.

Чтобы включить трассировку, можно использовать директиву страницы или параметр конфигурации. Давайте посмотрим на оба.

Директива трассировки страниц

Директивы страниц — это специальные инструкции, которые ASP.NET использует при обработке запроса на ASP.NET ресурс. Директивы страницы можно использовать для переопределения или применения параметров конфигурации для ASP.NET страницы.

Директива должна быть первым элементом на странице. Он объявляется с помощью следующего синтаксиса:

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

Используя приведенный выше синтаксис, мы сообщаем ASP.NET, что нам нужно включить трассировку на странице:

<%@ Page Trace="true" %>

Если мы добавим указанную выше директиву в наш пример кода, выходные данные страницы выглядят немного иначе:

Рис. 2. Трассировка включена

Теперь выходные данные трассировки добавляются в нижнюю часть страницы. Выходные данные трассировки всегда добавляются в конце страницы.

Теперь давайте посмотрим, как включить трассировку на уровне приложения. Затем мы обсудим, что содержит выходные данные трассировки.

Трассировка приложений

ASP.NET использует XML-файлы конфигурации для настройки параметров конфигурации для ASP.NET приложений. При каждой установке ASP.NET устанавливается файл конфигурации в каталоге [системный диск]\WinNt\Microsoft.NET\Framework\[версия]\ с именем config.web.

Файл конфигурации задает конфигурацию по умолчанию ASP.NET, а в бета-версии 1 называется корневым файлом конфигурации. Изменения, внесенные в этот файл, влияют на все наши ASP.NET веб-приложения. Мы также можем использовать файлы конфигурации в веб-приложениях для добавления или удаления параметров, полученных из config.web по умолчанию.

Я подробно рассмотрим конфигурацию в следующем столбце. Сейчас мы будем использовать корневой файл конфигурации для применения параметров трассировки для всех ASP.NET приложений.

Раздел "Трассировка"

Если открыть корневой файл config.web , мы найдем раздел трассировки:

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

Существует четыре атрибута для элемента трассировки :

  • enabled = "[true/false]" — мы можем задать для параметра enabled значение true или false. Трассировка либо включена на уровне приложения, либо отключена на уровне приложения. Если задано значение enabled=false, трассировка страниц по-прежнему поддерживается с помощью директивы Trace, описанной ранее.
  • requestlimit = " [int]"— общее количество запросов трассировки для кэширования в памяти для каждого приложения. Трассировка предоставляет специальный ресурс Trace.axd, который мы рассмотрим на данный момент, который используется для просмотра выходных данных трассировки, если pageoutput имеет значение false.
  • pageoutput = " [true/false]"— Если трассировка включена через файл конфигурации, администратор может включить или отключить трассировку на каждой странице. Трассировка pageoutput обеспечивает трассировку сведений для каждой страницы в приложении. Однако трассировка pageoutput может быть отключена, пока трассировка на уровне приложения по-прежнему включена (включено = "значение true"). Это сохраняет запросы трассировки в памяти, чтобы они были доступны через trace.axd, который мы будем рассматривать на данный момент, но не отображаются в выходных данных страницы.
  • tracemode = "[SortByTime | SortByCategory]" — параметр tracemode позволяет управлять выводом сведений о трассировке. Данные могут быть отсортированы по времени или категории, где категория отличается между параметрами системы и параметрами Trace.Write(), включенными разработчиком. Например, в нашем примере мы использовали следующее: Trace.Write("Inside Add() a:", a.ToString()). Первым параметром инструкции Trace.Write() является категория. В этом случае мы определили категорию как "Inside Add() a:". Если мы отсортировали по категории (tracemode = "SortByCategory""), этот элемент будет отсортирован до вызова обычной функции страницы в выходных данных трассировки. Сортировка по времени, с другой стороны, сортирует по количеству времени, затраченного на вызов.

Использование трассировки приложений

Используя тот же пример кода выше, мы могли бы удалить директиву page и включить те же функции, изменив параметры трассировки config.web .

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

Теперь мы можем вызвать наш пример приложения, удалив директиву Page , и получить те же выходные данные:

Рис. 3. Трассировка включена, директива Page отсутствует

Но что делать, если мы хотим использовать функцию, упомянутую ранее, в которой мы включаем трассировку, но отключаем выходные данные на странице?

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

Если бы мы запросили пример приложения с указанными выше параметрами конфигурации, мы не получим выходных данных трассировки, хотя трассировка по-прежнему включена. Для просмотра выходных данных трассировки используется специальное приложение с именем trace.axd.

Trace.axd

Trace.axd является обработчиком HTTP. Обработчик HTTP — это параметр программирования, который позволяет обрабатывать запросы и ответы на самом базовом уровне. Обработчики HTTP эквивалентны расширениям ISAPI. Однако, в отличие от ISAPI, их можно создавать на любом языке .NET. Обработчики HTTP подробно рассматриваются в следующем столбце.

Trace.axd — это http-обработчик, который можно использовать для запроса сведений трассировки приложения. При запросе нам будет предоставлен журнал трассировки последних n запросов; n определяется значением, заданным параметром requestlimit="[int]" в нашем файле конфигурации.

Чтобы использовать trace.axd, просто запросите trace.axd в том же каталоге приложения, что и для примера приложения:

Рис. Запросы трассировки приложений

Как видно на снимке экрана, мы представляем список трассировок, которые можно просмотреть. Эти представления трассировки идентичны сведениям, которые трассировка будет добавлять на страницу, без включения выходных данных со страницы:

Рис. 5. Сведения о запросе

Теперь, когда мы рассмотрели настройку и использование трассировки, давайте рассмотрим выходные данные трассировки.

Интерпретация выходных данных трассировки

Выходные данные, предоставляемые представлением трассировки с помощью Trace.axd или на странице, содержат шесть разделов подробных сведений:

  • Сведения о запросе— это основные сведения, такие как идентификатор сеанса, время запроса, тип HTTP-запроса и код состояния http-ответа.
  • Сведения о трассировки. В этом разделе представлено табличное представление категорий и сообщений. Если в коде используются операторы Trace.Write(), два параметра, которые принимает Trace.Write(), будут использоваться в качестве значений Category и Message соответственно. Кроме того, нам предоставляется время от первого до последнего байта.
  • Дерево элементов управления. Хотя это еще не обсуждалось в этом столбце, ASP.NET использует серверные элементы управления, чтобы позволить нам декларативно создавать приложения. В разделе Дерево элементов управления содержатся сведения об элементах управления на нашей странице. Нам предоставляются идентификатор, тип, размер отрисовки и размер состояния представления элемента управления. Эти сведения дают нам представление о том, какие элементы управления мы используем, а также связанные с ними затраты (размер отрисовки и состояние представления).
  • Коллекция файлов cookie — все файлы cookie, отправляемые клиентом в заголовках запроса, анализируются и отображаются их имена, значения и размеры.
  • Коллекция заголовков — заголовки HTTP, представленные клиентом серверу, предоставляются в этом разделе. Это простая таблица со списком Имя и Значение.
  • Переменные сервера— в разделе переменные сервера представлена таблица пар "имя-значение" с переменными сервера.

Использование трассировки

Как видно, трассировка — это новая мощная функция ASP.NET, предназначенная для упрощения разработки веб-приложений. Тем не менее, я думал, что было бы также целесообразно упоминание, когда вы должны и не должны использовать трассировку.

Развернутые приложения

Трассировка добавляет дополнительные издержки на запросы и не должна быть включена для развернутых приложений. Однако операторы Trace.Write() можно оставить в , так как они игнорируются, если трассировка не включена.

Для развернутых приложений, в которых мы хотим собирать данные, я бы предложил использовать классы, найденные в пространстве имен System.Diagnostics . Эти классы, которые я попытаюсь охватить в следующем столбце, позволяют нам записывать данные непосредственно в журнал событий Windows.

Мы определенно должны использовать трассировку при создании приложения, но отключать ее, когда мы будем готовы к развертыванию приложения, так же, как мы удалили бы эти инструкции Response.Write( ).

Отключение Trace.axd

Если вы установили ASP.NET на рабочем веб-сервере, рекомендуется явно отключить Trace.axd. Откройте корневой файл config.web , найдите <httphandlers> раздел и добавьте следующую запись:

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

Примечание: Можно также вырезать всю <add/> запись, но <remove> этот вариант лучше, так как он оставляет код в файле конфигурации и выполняет ту же задачу, отключив trace.axd. Эта проблема будет устранена в бета-версии 2 ASP.NET.

Сводка

Функция трассировки в ASP.NET — это новый эффективный способ отслеживания действий приложения. Раньше мы использовали операторы Response.Write() для трассировки приложения по мере его выполнения, но теперь можно использовать инструкции Trace.Write() и оставить их в развернутом коде. Это приводит к уменьшению числа ошибок, так как мы не удаляем код, когда готовы к развертыванию приложения.

Ресурсы ASP.NET

Наконец, я хотел бы назвать некоторые из новых ASP.NET доступных ресурсов. Посетите страницу https://www.asp.net , чтобы узнать больше о ASP.NET ресурсах.

  • Eraserver.net предлагает размещение ASP.NET.

Роб Ховард является руководителем программы для ASP.NET в команде платформа .NET Framework. Он проводит все свободное время, которое у него есть либо со своей семьей, либо нахлыстом ловли в восточном Вашингтоне.