Поделиться через


Пошаговое руководство. Использование трассировки в Visual Web Developer для поиска ошибок на веб-страницах

Обновлен: Ноябрь 2007

Существует несколько способов поиска ошибок на веб-странице ASP.NET. В их число входит использование отладчика и трассировки. При трассировке отображаются сообщения о действиях, происходящих во время обработки страницы. Эти сообщения могут включать сведения, выбранные пользователем для отображения. Трассировка также позволяет отображать сведения о данных, обмен которыми происходит между сервером и обозревателем. Обмен данными включает сведения об элементах управления, переменные сервера, имя пользователя, файлы Cookie и т. д. В этом пошаговом руководстве представлены инструкции по использованию трассировки.

Трассировка может оказать полезной в тех случаях, когда использование отладчика является нецелесообразным или не рекомендуется. Например, отладчик может быть недоступен, так как страницы находятся на удаленном сервере. Трассировка также позволяет упростить просмотр сведений, например заголовка HTTP, которые не являются доступными явным образом в отладчике. Сведения об отладке см. в разделе Пошаговое руководство. Отладка веб-страниц в Visual Web Developer.

В данном руководстве демонстрируется использование трассировки. Будет создана веб-страница, на которой отображается запрос на ввод пользователем имени, а затем отображается имя. Страница также сохраняет имя в файл Cookie, благодаря чему пользователю не придется вводить его повторно.

yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

Для реальных приложении более эффективным способом сохранения личных сведений является использование свойств профиля ASP.NET. Подробные сведения см. в разделе Общие сведения о свойствах профилей ASP.NET. Однако использование файла Cookie в этом пошаговом руководстве упрощает код, что позволяет сосредоточиться на трассировке.

В этом пошаговом руководстве будут намеренно внесены некоторые ошибки. Затем будет использована трассировка для просмотра состояния обработки страница, что позволит выявить ошибки.

В данном пошаговом руководстве представлены следующие задачи:

  • Включение трассировки для отдельной страницы.

  • Чтение результатов трассировки.

  • Отображение сведений о пользовательской трассировке.

  • Просмотр сведений трассировки в отдельном окне трассировки.

  • Создание пользовательских результатов трассировки.

Обязательные компоненты

Для выполнения инструкций данного пошагового руководства необходимы следующие компоненты:

  • средство веб-разработки Microsoft Visual Web Developer;

  • платформа .NET Framework.

В данном пошаговом руководстве предполагается, что пользователь знаком с методами работы в Visual Web Developer. Введение в Visual Web Developer см. в разделе Пошаговое руководство. Создание базовой веб-страницы в Visual Web Developer.

Создание веб-узла

Если вы уже создали веб-узел в Visual Web Developer, выполнив Пошаговое руководство. Создание базовой веб-страницы в Visual Web Developer, можно использовать этот веб-узел и перейти к разделу «Добавление элементов управления» далее в данном пошаговом руководстве. В противном случае создайте новый веб-узел и страницу, выполнив следующие действия.

yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

В этом пошаговом руководстве предполагается, что работа ведется на странице ASP.NET, которая использует файл кода программной части из своего кода.

Создание веб-узла на базе файловой системы

  1. Откройте Visual Web Developer.

  2. В меню Файл выберите Создатьвеб-узел.

    Откроется диалоговое окно Создать веб-узел.

  3. В группе Установленные шаблоны Visual Studio выберите Веб-узел ASP.NET.

  4. В крайнем правом поле Расположение введите имя папки, где следует хранить страницы веб-узла.

    Например, введите имя папки C:\WebSites.

  5. В списке Язык выберите язык программирования, с которым вы предпочитаете работать.

  6. Нажмите кнопку ОК.

    Visual Web Developer создаст папку и новую страницу с именем Default.aspx.

Добавление страницы

Если используется существующий веб-узел, можно создать новую страницу. Если страница, которую можно использовать в этом пошаговом руководстве, уже существует, перейдите к следующему разделу.

Создание новой страницы

  1. В обозревателе решений щелкните правой кнопкой мыши имя веб-узла и нажмите кнопку Добавить новый элемент.

  2. В диалоговом окне Добавление нового элемента <Path> в меню Установленные шаблоны Visual Studio выберите Веб-форма.

  3. В поле Имя введите FirstWebPage.aspx.

  4. В списке Язык выберите язык программирования, с которым вы предпочитаете работать.

  5. Если страница создается на языке Visual Basic или C#, установите флажок Размещать код в отдельном файле.

  6. Нажмите Добавить.

Добавление элементов управления

Следующим действием после создания веб-узла и открытия страницы является добавление нескольких элементов управления на страницу.

Добавление элементов управления и кода для отладки.

  • Перейдите в представление конструктора, а затем из группы Стандартные в панели элементов перетащите на страницу следующие элементы управления и задайте их свойства, как показано в таблице.

    • Элемент управления

    • Свойства

    TextBox

    ID: textName

    Text: (пусто)

    Button

    ID: buttonDisplayName

    Text: Отправить

    Label

    ID: labelName

    Text: (пусто)

    yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

    Для данного пошагового руководства макет страницы не имеет значения.

Добавление кода

Следующим этапом является добавление кода на страницу. Если страница выполняется правильно, пользователь может ввести имя, а затем нажать кнопку Отправить, которая отображает имя элемента управления Label. Если пользователь закрывает обозреватель, а затем возвращается на страницу, страница уже будет содержать имя пользователя, так как оно сохранено в файле Cookie.

Следующие этапы позволят вам добавить код. Ни процедура добавления кода, представленная здесь, ни сам код не являются абсолютно правильными. Это сделано намеренно, чтобы вы могли использовать трассировку для поиска ошибок на странице.

Добавление кода

  1. В обозревателе решений щелкните правой кнопкой мыши элемент FirstWebPage.aspx и выберите пункт Перейти к коду.

    yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

    Не нажимайте кнопку в представлении конструктора дважды.

  2. Введите следующий код в определении класса.

    yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

    При работе со страницей в одном файле вставьте код в блок <script>.

    Protected Sub buttonDisplayName_Click(ByVal sender As Object, _
          ByVal e As EventArgs)
       labelName.Text = Server.HtmlEncode(textName.Text)
       Response.Cookies("username").Value = labelName.Text
    End Sub
    
    protected void buttonDisplayName_Click(Object sender, EventArgs e)
    {
        labelName.Text = Server.HtmlEncode(textName.Text);
        Response.Cookies["username"].Value = labelName.Text;
    }
    

    В этом коде выполняются следующие задачи:

    • Считывает значение элемента управленияTextBox и отображает значение в элементе управления Label. При выполнении этой логики код вызывает метод HtmlEncode, который преобразовывает потенциально исполняемые символы HTML, например правую угловую скобку (<), в эквивалентные отображаемые символы. Эта мера безопасности предназначена для предотвращения использование сценариев. Подробные сведения см. в разделе Script Exploits.

    • Создает файл Cookie с именем username, в котором сохраняется значение, введенное пользователем.

  3. Добавьте следующий метод либо под, либо над обработчиком Click, который был создан на предыдущем этапе.

    Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) _
            Handles Me.Load
       If Not Request.Cookies("username") Is Nothing Then
          labelName.Text = Request.Cookies("username").Value
       End If
    End Sub
    
    void Page_Load(Object sender, EventArgs e)
    {
        if(Request.Cookies["username"] != null)
        {
            labelName.Text = Request.Cookies["username"].Value;
        }
    }
    

Проверка страницы

Теперь можно проверить страницу. Если были выполнены предусмотренные неверные действия на этапах процедуры в предыдущем разделе, страница не будет работать должным образом.

Проверка страницы

  1. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

  2. При отображении страницы введите имя в текстовом поле, а затем нажмите кнопку Отправить.

    Обратите внимание, что даже если нажатие кнопки Отправить приводит к обратной передаче страницы на сервер, имя не отображается.

  3. Закройте обозреватель.

Теперь можно использовать трассировку, которая поможет найти ошибки на странице.

Использование трассировки для поиска ошибок

В этом разделе будет включена трассировка на странице. Вы проверите результаты трассировки, а затем добавите пользовательские сообщения трассировки, которые позволят выявить ошибки на странице.

Включение трассировки для страницы

  1. Откройте страницу FirstWebPage.aspx и переключитесь в представление конструктора.

  2. В окне «Свойства» щелкните DOCUMENT в списке.

    Это отображает свойства для страницы.

  3. Установите для параметра Trace (Трассировка) значение true.

    Задание трассировки фактически осуществляется как часть директивы @ Page. Просмотреть это можно путем переключения в представление «Исходный код» и изучения первой строки на странице. Директива @ Page будет иметь приблизительно следующий вид:

    <%@ Page language="VB"      Trace="true" %>
    
    <%@ Page language="C#"      Trace="true" %>
    
  4. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

    Страница откроется в обозревателе. В верхней часть отображается текст и элементы управления, добавленные на страницу. Под текстом и элементами управления отображаются результаты трассировки, которые содержат многочисленные данные об обработке страницы и включают следующие сведения:

    • Последовательность событий страницы, которые произошли во время выполнения страницы.

    • Типы, имена и размеры элементов управления на странице.

    • Файлы Cookie и их содержимое.

    • Переменные сервера, которые являются набором всей информации, отправляемой обозревателем на сервер.

    Обратите внимание, что в блоке Request Details (Сведения о запросе) (первый блок сведений о трассировке) для параметра Request Type (Тип запроса) установлено значение GET. Это означает, что страница была выполнена первый раз, то есть, что это не обратная передача.

  5. В поле введите имя, а затем нажмите кнопку Отправить.

    Для параметра Request Type (Тип запроса) теперь установлено значение POST. Это означает, что выполнена обратная передача страницы. Нажатие кнопки Отправить не приводит к отображению страницы.

  6. Закройте обозреватель.

Можно использовать пользовательские результаты трассировки, чтобы выполнить логику на странице.

Добавление пользовательских результатов трассировки

  1. Добавьте следующие выделенные строки в обработчик buttonDisplayName_Click, который был создан на этапе «Добавление кода» ранее в этом пошаговом руководстве:

    Protected Sub buttonDisplayName_Click(ByVal sender As Object, _
          ByVal e As EventArgs)
       Trace.Warn("debugging", "Start buttonDisplayName Click handler")
       labelName.Text = Server.HtmlEncode(textName.Text)
       Response.Cookies("username").Value = labelName.Text
       Trace.Warn("debugging", "End buttonDisplayName Click handler")
    End Sub
    
    protected void buttonDisplayName_Click(Object sender, EventArgs e)
    {
       Trace.Warn("debugging", "Start buttonDisplayName Click handler");
       labelName.Text = Server.HtmlEncode(textName.Text);
       Response.Cookies["username"].Value = labelName.Text;
       Trace.Warn("debugging", "End buttonDisplayName Click handler");
    }
    

    Метод Warn добавляет пользовательские сообщения к результатам трассировки. Хотя класс TraceContext также предоставляет метод Write, метод Warn является более полезным, так как результат отображается цветом.

  2. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

  3. Нажмите кнопку Отправить.

    При проверке результатов трассировки обратите внимание, что результаты не содержат красного текста. На основании этого можно сделать заключение, что обработчик Click для кнопки Отправить не вызывается.

    Наиболее распространенной причиной того, что обработчик не вызывается, является неверная привязка элемента управления к обработчику событий. И это действительно так в данном случае: хотя код обработки событий был добавлен, привязка событий Click для кнопки Отправить к обработчику не была выполнена. Как правило, Visual Web Developer привязывает событие к обработчику после двойного щелчка элемента управления в представлении конструктора.

  4. Закройте обозреватель.

  5. В режиме исходного кода добавьте следующий выделенный атрибут к элементу <asp:button>:

    <asp:button id="buttonDisplayName" runat="server" text="Submit"
        onclick="buttonDisplayName_Click" />
    
  6. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

  7. Введите имя в окне, а затем нажмите кнопку Отправить.

    Пользовательские результаты трассировки отображаются красным цветом в разделе Информация трассировки, в котором перечислены этапы обработки, пройденные страницей.

    В выходном окне этого раздела отображаются сообщения в том порядке, в котором они были созданы в процессе обработки страницы. Вы добавили сообщения в обработчик событий Click, который обрабатывается между строками Begin Raise PostBackEvent и End Raise PostBackEvent. Добавление пользовательских сообщений позволяет получать сведения не только о вызове обработчика, но и о том, на каком этапе цикла обработки страницы выполняется код.

    Категория рядом с пользовательскими сообщениями является категорией debugging, которая указывается при вызове метода Warn. Можно указать любую необходимую категорию, и, если это необходимо, задать для свойства TraceMode страницы значение SortByCategory, чтобы упростить поиск категории в результатах трассировки.

    Кроме того, обратите внимание, что введенное имя отображается в метке.

Теперь, когда обработчик Click для кнопки Отправить работает верно, можно выполнить проверку оставшейся части кода на странице, включая файл Cookie.

  1. Закройте обозреватель.

  2. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

    Ожидается, что имя, введенное ранее, автоматически появится в метке, так как обработчик Click для кнопки Отправить задает файл Cookie, а обработчик Page_Load считывает его при следующей обратной передаче. Однако метка никогда не задается из файла Cookie.

    Если файл Cookie записывается, но не сохраняется, часто ошибка вызывается тем, что вы не установили явную дату окончания срока действия Cookie. Файл Cookie, для которого не задана дата окончания срока действия, является файлом Cookie сеанса. Файл Cookie сеанса сохраняется в памяти сервера только до закрытия обозревателя. То есть файл Cookie не записывается в обозреватель. На следующих этапах эта проблема будет устранена.

  3. Закройте обозреватель.

  4. В режиме исходного кода добавьте следующую выделенную строку в обработчик buttonDisplayName_Click:

    Protected Sub buttonDisplayName_Click(ByVal sender As Object, _
            ByVal e As EventArgs)
        Trace.Warn("debugging", "Start buttonDisplayName Click handler")
        labelName.Text = Server.HtmlEncode(textName.Text)
        Response.Cookies("username").Value = labelName.Text
        Response.Cookies("username").Expires= _       DateTime.Now.AddMinutes(30)
       Trace.Warn("debugging", "End buttonDisplayName Click handler")
    End Sub
    
    protected void buttonDisplayName_Click(Object sender, EventArgs e)
    {
        Trace.Warn("debugging", 
            "Start buttonDisplayName Click handler");
        labelName.Text = Server.HtmlEncode(textName.Text);
        Response.Cookies["username"].Value = labelName.Text;
        Response.Cookies["username"].Expires=         DateTime.Now.AddMinutes(30);
        Trace.Warn("debugging", "End buttonDisplayName Click handler");
    }
    

    Новая строка явно задает срок действия файла Cookie, который истекает через 30 минут.

  5. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

  6. Введите имя в окне, а затем нажмите кнопку Отправить.

    Имя отображается в обозревателе. В блоке Response Cookies Collection (Коллекция ответных файлов Cookie) результатов трассировки отображается заданный файл Cookie.

  7. Закройте обозреватель.

  8. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

    На этот раз имя вводится автоматически. В блоке Request Cookies Collection (Коллекция ответных файлов Cookie) результатов трассировки теперь отображается, что обозреватель передает Cookie на страницу.

Отображение сведений трассировки в окне средства просмотра трассировки.

Задание страницы для отображения результатов трассировки полезно только при работе с отдельной страницей. Однако, если осуществляется работа с несколькими страницами в приложении, включение и выключение трассировки для каждой страницы может быть неудобным. Более того, отображение сведений о результатах трассировки на странице при ее выполнении может мешать пользователю. И к тому же, вы, возможно, не хотите, чтобы результаты трассировки отображались для пользователей приложения.

Можно настроить трассировку не только на уровне страницы, но и на уровне приложения. Задание трассировки на уровне приложения предоставляет два преимущества:

  • Можно одновременно включать и выключать трассировку для всех страниц.

  • Можно отображать результаты трассировки в отдельном окне обозревателя — средстве просмотра трассировки, — а не в качестве части результатов для страницы.

Если трассировка на уровне приложения включена, ASP.NET сохраняет результаты трассировки всех страниц в кэше. Можно задать некоторые параметры, чтобы указать количество страниц результатов трассировки, сохраняемых в кэше, и сохранение самых последних либо наиболее старых записей. Затем можно вызвать средство просмотра трассировки в обозревателе и выбрать проверяемый результат трассировки.

В этом разделе пошагового руководства будет включена трассировка на уровне приложения и использовано средство просмотра трассировки для проверки результата трассировки.

Включение трассировки на уровне приложения

  1. Перейдите в режим исходного кода, а затем в директиве @ Page в верхней части странице удалите Trace="true".

    yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

    Удалите атрибут, а не просто задайте для него значение false. В противном случае следующие шаги данного пошагового руководства будут выполнены неправильно.

  2. В меню Веб-узел выберите Конфигурация ASP.NET.

    Появляется средство администрирования веб-узла ASP.NET.

  3. Щелкните Конфигурация приложения.

  4. В группе Debugging and Tracing (Отладка и трассировка) щелкните Configure debugging and tracing(Настройка отладки и трассировки), а затем установите флажок Capture tracing information (Запись сведений о трассировке).

    Этот параметр включает трассировку на уровне приложения.

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

  5. Закройте средство администрирования веб-узла ASP.NET.

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

Просмотр результатов трассировки в отдельном окне обозревателя

  1. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

    Обратите внимание, что на странице больше не отображаются результаты трассировки. Страница отображается так, как ее видит пользователь.

  2. Введите имя в окне и нажмите кнопку Отправить, чтобы убедиться, что страница работает правильно.

  3. Откройте новое окно обозревателя.

  4. В поле Адрес обозревателя введите URL-адрес узла, указав trace.axd в качестве имени страницы, с которой осуществляется работа.

    Например, если имеется следующий URL-адрес страницы:

    https://localhost:8081/WebSite/Default.aspx
    

    Введите следующее:

    https://localhost:8081/WebSite/trace.axd
    
    yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

    Быстрым способом выполнения этой задачи является копирование URL-адреса исходной страницы с изменением только имени страницы.

    В обозревателе отображается текущий кэш записей трассировки.

  5. Щелкните Просмотр сведений для последней (наиболее новой) записи трассировки.

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

  6. Перейдите к экземпляру обозревателя, который содержит исходную страницу.

  7. Введите новое имя в окне, а затем нажмите кнопку Отправить.

    В результате этого действия создается новая запись журнала трассировки.

  8. Перейдите к экземпляру обозревателя, который содержит сведения.

  9. В обозревателе щелкните Назад для возврата к списку записей трассировки, а затем щелкните Обновить, чтобы обновить список записей.

    Появляется новая записи, которая представляет результаты трассировки, созданные в шаге 7.

  10. Закройте оба окна обозревателя.

Создание пользовательских результатов трассировки

Как вы видели, результаты трассировки содержат большой объем сведений, которые иногда являются излишними. Например, может возникнуть необходимость ограничить результаты трассировки только результатами трассировки, созданными самостоятельно. Трассировка позволяет читать содержимое буфера трассировки и выборочно отображать необходимую информацию.

Для создания пользовательских результатов трассировки обработайте событие TraceFinished для объекта Trace. В обработчике событий можно прочитать буфер трассировки.

Создание пользовательских результатов трассировки

  1. На странице, с которой осуществлялась работа, добавьте в обработчик Page_Load следующий выделенный код:

    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
       If Not Request.Cookies("username")  Is Nothing Then
          labelName.Text = Request.Cookies("username").Value
       End If
       AddHandler Trace.TraceFinished, AddressOf Me.TraceFinished   If IsPostBack Then      Trace.Write("debugging", "Page_Load (Postback)")   Else      Trace.Write("debugging", "Page_Load (First Time)")   End If
    End Sub
    
    void Page_Load(object sender, EventArgs e)
    {
        if(Request.Cookies["username"].Value != null)
        {
            labelName.Text = Request.Cookies["username"].Value;
        }
        Trace.TraceFinished += new         TraceContextEventHandler(this.TraceFinished);    if (Page.IsPostBack)    {        Trace.Write("debugging", "Page load (postback)");    }    else    {        Trace.Write("debugging", "Page load (first time)");    }
    }
    

    Код выполняет следующие две функции:

    • Привязывает метод на странице к событию TraceFinished для объекта Trace, вызываемого по окончании формирования результатов трассировки для страницы. Код метода будет написан позже.

    • Записывает некоторые сведения трассировки.

  2. Создайте следующий метод для обработки событий TraceFinished:

    Sub TraceFinished(ByVal sender As Object, _
           ByVal e As TraceContextEventArgs)
       Dim traceRecord As TraceContextRecord
       For Each traceRecord In e.TraceRecords
          If traceRecord.Category = "debugging" Then
             Response.Write("<BR>" & traceRecord.Message)
          End If
       Next
    End Sub
    
    void TraceFinished(object sender, TraceContextEventArgs e)
    {    
        foreach(TraceContextRecord traceRecord in e.TraceRecords)
        {    
               if(traceRecord.Category == "debugging")    
               {        
                   Response.Write("<br>" + traceRecord.Message);
               }    
        }    
    }
    

    Этот код выполняется по окончании формирования результатов трассировки. Буфер трассировки доступен как коллекция в свойстве TraceRecords аргумента события e. Код реализует цикл по коллекции и отображает значение любой записи трассировки, которая имеет категорию debugging; в этом пошаговом руководстве для все пользовательских результатов трассировки установлена категория debugging.

На этом этапе пошагового руководства выполняется настройка веб-узла таким образом, чтобы включить трассировку всех страниц, но результаты трассировки направляются в средство просмотра трассировки, а не на страницу. Если веб-узел настроен иным образом, например, если результаты трассировки отображаются на странице, выполните действия, описанные в процедуре «Включение трассировки на уровне приложения» раздела «Отображение сведений трассировки в окне средства просмотра трассировки», который представлен ранее в данном пошаговом руководстве.

Теперь можно проверить пользовательские результаты трассировки.

Проверка пользовательских результатов трассировки

  1. Чтобы запустить страницу, нажмите сочетание клавиш CTRL + F5.

    Когда страница отображается в обозревателе, появляется сообщение Page load (first time) (Загрузка страницы (в первый раз)), но другие результаты трассировки отсутствуют.

  2. Нажмите кнопку Отправить.

    Появляются сообщения Page load (postback) (Загрузка страницы (обратная передача)), Start buttonDisplayName Click handler (Запуск обработчика buttonDisplayName Click) и End buttonDisplayName Click handler (Завершение обработчика buttonDisplayName Click).

yc8h9b0b.alert_note(ru-ru,VS.90).gifПримечание.

Если число кэшируемых запросов, указанное в атрибуте requestLimit элемента Элемент trace (схема параметров ASP.NET), превышено, событие TraceFinishedне вызывается и сообщения на веб-странице не отображаются.

Следующие действия

В данном пошаговом руководстве показаны основные функциональные возможности трассировки в ASP.NET. Помимо использования трассировки для отображения сведений в веб-приложении, можно интегрировать трассировку ASP.NET с другим инструментированием Например, попробуйте выполнить следующие действия:

См. также

Другие ресурсы

Tracing in ASP.NET Web Pages (Visual Studio)