Класс Page

190

Теперь, когда вы увидели, что собой представляет жизненный цикл страницы, и узнали, каким образом в странице содержатся элементы управления, не помешает указать, что экземпляр самой страницы тоже создается в виде объекта элемента управления. В действительности все веб-формы фактически являются экземплярами класса Page из ASP.NET, который находится в пространстве имен System.Web.UI.

Вы наверняка уже догадались об этом, заметив, что каждый класс отделенного кода явно наследуется от System.Web.UI.Page. Это означает, что каждая создаваемая веб-форма сразу же получает огромный объем функциональности, такой как уже встречавшийся ранее метод FindControl() и свойство IsPostBack. Помимо этого, наследование от Page также еще предоставляет коду доступ к следующим чрезвычайно полезным свойствам:

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

Более подробно об этих объектах рассказывается в последующих разделах.

Объекты Session, Application и Cache

Объект Session является экземпляром класса System.Web.SessionState.HttpSessionState. Он предназначен для хранения любого типа пользовательских данных, который должен постоянно существовать между запросами веб-страниц. Объект Session предоставляет словарный доступ к набору пар "имя-значение", представляющему пользовательские данные для этого сеанса. Состояние сеанса часто применяется для обслуживания информации наподобие имени и идентификатора пользователя, покупательской тележки либо других элементов, удаляемых, когда пользователь уже не посещает страницы веб-сайта.

Объект Application является экземпляром класса System.Web.HttpApplicationState. Подобно объекту Session, он тоже представляет собой словарь данных типа "имя-значение". Однако эти данные являются глобальными для всего приложения.

Что касается объекта Cache, то он является экземпляром класса System.Web.Caching.Cache. В нем также хранится глобальная информация, но он предлагает более масштабируемый механизм хранения, поскольку ASP.NET может удалять объекты в случае нехватки памяти сервера. Как и другие наборы состояний, это, по сути, коллекция объектов "имя-значение", однако здесь для каждого элемента можно также устанавливать специализированные политики истечения срока и определять зависимости.

Выбор способа реализации управления состоянием является одной из ключевых задач разработки веб-приложения.

Объект Request

Объект Request является экземпляром класса System.Web.HttpRequest. Этот объект представляет значения и свойства HTTP-запроса, который привел к загрузке страницы. В нем содержатся все параметры, касающиеся URL, а также все остальные данные, которые были отправлены клиентом. Большая часть из предоставляемой объектом Request информации заключена в оболочку абстракций более высокого уровня (например, в оболочку модели веб-элементов управления ASP.NET), поэтому она даже и близко не так важна, как это было в классической ASP-разработке.

Тем не менее, объект Request все равно может использоваться, например, для выяснения того, каким браузером пользуется клиент, или же для создания cookie-наборов и последующего изучения их содержимого.

В таблице ниже перечислены некоторые наиболее часто применяемые свойства объекта Request:

Свойства объекта HttpRequest
Свойство Описание
AnonymousID Уникальным образом идентифицирует текущего пользователя, если был включен анонимный доступ.
ApplicationPath и PhysicalApplicationPath ApplicationPath извлекает информацию о месте размещения виртуального каталога приложения ASP.NET (URL-адрес), a PhysicalPath — о месте размещения его "реального"каталога
Browser Предоставляет ссылку на объект HttpBrowserCapabilities, в котором содержатся свойства, описывающие различные функциональные возможности браузера, наподобие наличия в нем поддержки для элементов управления ActiveX, cookie-наборов, сценариев VBScript и фреймов
ClientCertificate Объект HttpClientCertificate, предоставляющий сертификат безопасности для текущего запроса, если таковой существует
Cookies Предоставляет коллекцию cookie-наборов, отправляемых с этим запросом
FilePath и CurrentExecutionFilePath Возвращают реальный путь к файлу (относительно сервера) для выполняемой в данный момент страницы. FilePath представляет страницу, запустившую процесс выполнения. Это то же самое, что и CurrentExecutionFilePath, если вы не переместили пользователя на новую страницу без перенаправления (например, с помощью метода Server.Transfer()), в случае чего CurrentExecutionFilePath отражает новую страницу, a FilePath определяет исходную страницу
Form Представляет коллекцию переменных формы, обратно отправляемых странице. В большинстве случаев вместо использования данной коллекции вы будете извлекать эту информацию из свойств элемента управления
Headers и ServerVariables Предоставляют словарную коллекцию HTTP-заголовков и серверных переменных с индексацией по имени. Эти коллекции по большей части состоят из низкоуровневой информации, которая отправлялась браузером вместе с веб-запросом (например, информации о типе браузера, поддерживаемых им функциональных возможностях, установленных языковых параметрах, удостоверениях, используемых для аутентификации данных, и т.д.). Обычно эту информацию гораздо легче получить из других свойств объекта HttpRequest или высокоуровневых классов ASP.NET
IsAuthenticated и IsSecureConnection Возвращают true в случае успешной аутентификации пользователя и подключения пользователя по протоколу защищенных сокетов (Secure Sockets Layer — SSL)
IsLocal Возвращает true, если пользователь запрашивает страницу с локального компьютера
QueryString Предоставляет параметры, переданные в строке запроса
Url и UrlReferrer Выдают объект Uri, представляющий текущий адрес страницы и страницу, с которой переходит пользователь (предыдущую страницу, содержащую ссылку на данную страницу)
UserAgent Строка, представляющая тип браузера. Internet Explorer предоставляет для этого свойства значение MSIE. ASP.NET использует эту информацию для выяснения того, о браузере какого типа идет речь, и, следовательно, для определения, какие функциональные возможности этот браузер должен поддерживать (такие как cookie-наборы, сценарии JavaScript и т.д.). Это, в свою очередь, может влиять на способ визуализации веб-элементов управления.
UserHostAddress и UserHostName Извлекают информацию об IP-адресе и DNS-имени удаленного клиента. К этой информации также можно получать доступ и через коллекцию ServerVariables. Однако из-за трансляции сетевых адресов (Network Address Translation — NAT) она не всегда бывает значимой. В зависимости от способа подключения к Интернету, многие клиенты могут использовать совместно один и тот же IP-адрес (например, IP-адрес шлюзового компьютера). Помимо этого, IP-адрес также еще может и меняться после выполнения нескольких запросов
UserLanguages Предоставляет отсортированный строковый массив, в котором перечислены языковые предпочтения клиента. Может быть полезно при создании многоязычных страниц

Объект Response

Объект Response является экземпляром класса System.Web.HttpResponse и представляет ответ веб-сервера на запрос клиента. При классической ASP-разработке объект Response был единственным способом программной отправки HTML-текста клиенту.

Теперь серверные элементы управления содержат вложенные объектно-ориентированные методы для выполнения визуализации самих себя. От разработчика требуется всего лишь установить значения их свойств. Поэтому объект Response даже близко не играет такой центральной роли, как раньше.

В следующей таблице перечислены некоторые наиболее часто применяемые члены класса HttpResponse:

Члены класса HttpResponse
Метод или свойство Описание
BufferOutput Когда это свойство установлено в true (значение по умолчанию), страница не отправляется клиенту до тех пор, пока не будет визуализирована и готова к отправке полностью, вместо того, чтобы отправляться по частям. В некоторых специфических сценариях имеет смысл устанавливать это свойство в false.
Наиболее очевидным примером является ситуация, когда клиент загружает большой файл. Если свойство BufferOutput установлено в false, клиент увидит диалоговое окно Save (Сохранить) и сможет выбрать имя файла, прежде чем этот файл будет загружен полностью
Cache Это свойство ссылается на объект HttpCachePolicy, который позволяет конфигурировать кэширование вывода
Cookies Это свойство предоставляет доступ к коллекции cookie-наборов, отправляемых вместе с ответом. Его можно использовать для добавления дополнительных cookie-наборов
Expires и ExpiresAbsolute Эти свойства можно использовать при кэшировании визуализируемого HTML-кода страницы, улучшающем показатели производительности при последующих запросах
IsClientConnected Это булевское значение, показывающее, подключен ли клиент к серверу. Если он уже не подключен, может потребоваться остановить какую-нибудь длинную операцию
Redirect() Этот метод заставляет браузер запросить другой URL-адрес, который указывает на новую страницу веб-приложения или на другой веб-сайт
RedirectPermanent() Этот метод перенаправляет браузер на новый URL-адрес, во многом подобно методу Redirect(). Разница в том, что он использует код состояния HTTP 301 (который указывает на то, что страница была перемещена навсегда), а не 302 (который указывает на то, что страница была перемещена временно)
RedirectToRoute() и RedirectToRoutePermanent() Эти методы похожи на методы Redirect() и RedirectPermanent(). Единственное отличие в том, что они используют маршрут (зарегистрированный шаблон URL, который не отображается непосредственно на страницу)
Transfer() Этот метод сообщает ASP.NET прекратить обработку текущей страницы и перейти к новой (указанной) странице с веб-формой. При этом не требуются полный цикл отправки и уведомление браузера и пользователя веб-приложения
TransferRequest() Этот метод похож на Transfer(), но позволяет переносить пользователя на страницу другого типа. Например, его можно применять для отправки пользователя с веб-формы ASP.NET на HTML-страницу.
Когда он используется, в действие приводится весь конвейер IIS для обработки нового ресурса, вместе со всеми соответствующими модулями HTTP. Но с методом TransferRequest() связан ряд существенных ограничений. Для его применения должен использоваться веб-сервер IIS 7 в интегрированном режиме. Кроме того, понадобится освободить состояние сеанса (если оно было получено) для предотвращения длительных задержек
ContentType Это свойство представляет заголовок, указывающий браузеру, содержимое какого типа он должен получить. Обычно в веб-формах ASP.NET, как и во всех веб-страницах, используется содержимое типа text/html (текст вперемешку с HTML). Однако в принципе может быть создан специальный обработчик HTTP, обслуживающий содержимое других типов
OutputStream Это свойство представляет данные, отправляемые браузеру в виде потока низкоуровневых байтов. Его можно использовать для подключения к модели потоков .NET
Write() Этот метод позволяет записывать текст прямо в поток ответа. Обычно вместо него лучше применять модель элементов управления и позволять элементам управления генерировать собственную HTML-разметку. При попытке использовать метод Response.Write() вместе с моделью элементов управления разработчик лишается возможности решать, где именно на странице должен размещаться текст.
Однако метод Response.Write() важен в ситуациях, когда элементы управления, генерирующие собственное HTML-представление, должны быть построены с нуля
BinaryWrite() и WriteFile() Эти методы позволяют брать двоичное содержимое из массива байтов или файла и записывать его прямо в поток ответа. Использовать их вместе с серверными элементами управления не имеет смысла, но они могут быть очень полезны при создании специального обработчика HTTP.
Например, можно создать HTTP-обработчик, считывающий данные для PDF-документа из записи в базе данных и записывающий их непосредственно в поток ответа с помощью метода BinaryWrite(). На стороне клиента конечный результат будет выглядеть точно так же, как и если бы пользователь загружал статический PDF-файл. При выполнении записи отличного от HTML содержимого не забывайте установить соответствующее значение для свойства ContentType

Перемещение между страницами

Самой важной функцией класса HttpResponse является предоставление небольшого набора методов, которые позволяют переходить с одной страницы на другую. Наиболее универсальным из них является метод Redirect(), который позволяет перенаправлять пользователя на другую страницу. Ниже приведен пример его применения:

// Перенаправление к файлу в текущем каталоге. 
Response.Redirect("PageFlow.aspx"); 
        
// Перенаправление на другой веб-сайт. 
Response.Redirect("http://www.google.com");

Метод Redirect() требует полного цикла отправки. По сути, он отправляет браузеру сообщение, которое заставляет его запросить новую страницу.

Метод Redirect() имеет перегруженную версию, которая принимает во втором параметре булевское значение. Это значение указывает, должен ли код страницы продолжить выполнение. По умолчанию, несмотря на то, что Redirect() перенаправляет пользователя и закрывает соединение, любой оставшийся код в методе по-прежнему будет выполняться вместе с остальными событиями страницы. Это позволяет при необходимости провести очистку. Но если во втором параметре передается значение true, ASP.NET немедленно прекратит обработку страницы, что потенциально сокращает рабочую нагрузку веб-сервера.

Если нужно переместить пользователя на другую веб-форму внутри того же самого веб-приложения, можно воспользоваться более быстрым подходом с помощью метода Server.Transfer(). Однако этот метод обладает некоторыми особенностями. Из-за того, что перенаправление происходит на стороне сервера, в окне клиентского веб-браузера остается исходный URL-адрес. По сути, у браузера нет никакой возможности узнать, что в действительности он отображает уже другую страницу. Это ограничение приводит к возникновению проблем, когда клиент обновляет страницу или устанавливает на ней закладку.

Кроме того, метод Server.Transfer() не умеет передавать управление отличной от ASP.NET странице или веб-странице, находящейся в другом веб-приложении или на другом веб-сайте.

Для перехода с одной страницы на другую доступен еще один прием — межстраничная отправка (cross-page posting). Он позволяет создавать страницу, которая отправляет себя другой странице, что дает возможность передать всю информацию состояния представления и содержимое любых элементов управления.

В ASP.NET 4 в классе HttpResponse появился еще один метод для перенаправления пользователя — RedirectPermanent() . Этот метод делает то же самое, что и Redirect(), т.е. отправляет браузеру сообщение о перенаправлении, указывающее на необходимость запроса новой страницы. Однако вместо кода состояния HTTP 302 (временное перенаправление) он использует код 301 (который обозначает постоянное перенаправление). Для веб-браузеров это отличие роли не играет, но для поисковых систем оно является очень важным. Когда поисковый робот исследует веб-сайт и получает код состояния 301, он обновляет каталог своей поисковой системы, занося в него информацию о новом URL-адресе.

Это значит, что методы Redirect() и RedirectPermanent() должны использоваться очень разными способами. Метод Redirect() необходимо применять для обеспечения обычной навигации и управления потоком выполнения в приложении (например, при прохождении пользователем какого-то процесса проверки), а метод RedirectPermanent() — при запросе старого URL-адреса, который поддерживался ранее, но больше не используется.

Обычно метод Redirect() будет вызываться где-то в коде веб-формы, в то время как метод RedirectPermanent() — в коде приложения, а точнее в методе Application_BeginRequest() внутри файла global.asax. Это позволит управлять всеми постоянными перенаправлениями в одном месте, не сохраняя заглушки для старых страниц. Ниже приведен пример:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
   // Веб-приложение больше не содержит страницу about.aspx
   if (Reguest.FilePath == "/about.aspx") 
   { 
       Response.RedirectPermanent("/about/about-Us.aspx"); 
   } 
   
   // (Сюда следует добавить дополнительные перенаправления.) 
} 

Объект Server

Объект Server является экземпляром класса System.Web.HttpServerUtility и предоставляет разнообразные вспомогательные методы и свойства, которые перечислены в таблице:

Члены класса HttpServerUtility
Метод или свойство Описание
MachineName Свойство, представляющее имя компьютера, на котором запускается страница. Это имя веб-сервера, используемого компьютером с целью его идентификации для остальной части сети
GetLastError() Извлекает объект исключения для самой поздней ошибки (или ссылку null, если таковая не существует). Эта ошибка должна была произойти во время обработки текущего запроса и не была обработана. Чаще всего используется в обработчике событий приложения, проверяющем сбойные ситуации
HtmlEncode() и HtmlDecode() Заменяет обычную строку строкой допустимых символов HTML (и наоборот)
UrlEncode() и UrlDecode() Заменяет обычную строку строкой допустимых символов URL (и наоборот)
MapPath() Возвращает физический путь к файлу, соответствующий определенному виртуальному пути к файлу на веб-сервере. Вызов MapPath() с указанием / возвращает физический путь к корневому каталогу веб-приложения. Также поддерживает пути, содержащие символ тильды (~), который представляет корневой каталог веб-сайта (например, ~/homepage.aspx)
Transfer() Передает выполнение другой веб-странице в текущем приложении. Этот метод похож на Response.Redirect(), но работает быстрее. Не может применяться для перемещения пользователя на сайт, расположенный на другом веб-сервере, или же на страницу, отличную от ASP.NET (такую как HTML или ASP)

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

MapPath() представляет собой еще один полезный метод объекта Server. Например, предположим, что вы хотите загрузить из текущего виртуального каталога файл по имени info.txt. Вместо того чтобы жестко кодировать путь, вы можете воспользоваться методом Server.MapPath() и с его помощью преобразовать относительный путь к своему веб-приложению в полный физический путь.

Кодирование HTML и URL

Класс Server также содержит методы, преобразующие обычные строки в представление, которое может безопасно использоваться как часть URL или отображаться на веб-странице. Например, предположим, что вы собираетесь отобразить на веб-странице следующий текст:

Тег <p> используется для обозначения абзаца.

При попытке записи этой информации на странице или ее помещении в элемент управления получится следующее:

Тег используется для обозначения абзаца.

Текст <p> не появится, к тому же браузер интерпретирует его как включение абзаца. С целью обхода такого автоматического поведения потребуется преобразовать потенциальные проблемные значения в специальные HTML-эквиваленты. Например, < превратится в &lt; в окончательной HTML-странице, а браузер отобразит этот символ как <. Полную таблицу преобразований символов в HTML-эквиваленты можно найти по адресу www.arininav.ru/js/entities.htm.

Ниже показан пример обхода проблемы с помощью метода Server.HtmlEncode():

Label1.Text = Server.HtmlEncode("Тег <p> используется для обозначения абзаца.");

Некоторые элементы управления обходят эту проблему, автоматически кодируя дескрипторы. (Веб-элемент управления Label не является одним из них. Вместо этого он позволяет вставлять HTML-дескрипторы любым желаемым образом.) Например, базовый набор серверных элементов управления HTML содержит дескрипторы InnerText и InnerHtml. При установке содержимого элемента управления с использованием InnerText все специальные символы автоматически преобразуются в свои HTML-эквиваленты. Однако это не поможет, если вы пожелаете установить дескриптор, содержащий смесь встроенных дескрипторов HTML и закодированных символов.

Метод HtmlEncode() особенно полезен, если вы извлекаете значения из базы данных и не уверены, является ли текст допустимой HTML-разметкой. С помощью метода HtmlDecode() можно привести текст в нормальную форму, если необходимо выполнять над ним дополнительные операции или сравнения в коде.

Подобным образом метод UrlEncode() преобразует текст в форму, которая может использоваться в URL, отменяя пробелы и другие спецсимволы. Это действие обычно производится над информацией, которая должна быть добавлена в строку запроса.

Следует отметить, что метод HtmlEncode() не преобразует пробелы в неразрываемые пробелы. Это означает, что если имеется последовательность символов пробела, браузер отобразит только один пробел. Этот эффект нежелателен, несмотря на то, что он не влияет на HTML-разметку. Для изменения такого поведения можно заменить пробелы неразрываемыми пробелами вручную с помощью метода String.Replace(). Просто удостоверьтесь, что это действие выполняется после кодирования строки, а не перед ним, или же последовательность фиксированных пробелов ( ) будет заменена символами и трактоваться как обычный текст:

// Закодировать недопустимые символы. 
line = Server.HtmlEncode(line); 
// Заменить пробелы неразрываемыми пробелами. 
line = line.Replace(" ", "&nbsp;");

Подобным образом метод HtmlEncode() не преобразует разрывы строк в дескриптор <br>. Это означает, что жесткие возвраты каретки будут игнорироваться до тех пор, пока вы специально не вставите дескрипторы <br>.

Проблема правильной кодировки ввода более важна, чем просто проверка правильного отображения данных. Если вы попытаетесь отобразить данные, включающие дескрипторы <script>, вы неумышленно выполните блок JavaScript-кода на машине клиента.

Объект User

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

Объект User реализует интерфейс System.Security.Principal.IPrincipal. Определенный класс зависит от используемого типа аутентификации. Например, пользователя можно аутентифицировать на основе информации об учетной записи Windows с использованием IIS или же с помощью специальной базы данных и выделенной страницы входа в систему. Однако важно понимать, что объект User предоставляет полезную информацию только в том случае, если веб-приложение выполняет какую-то разновидность аутентификации, которая ограничивает доступ анонимных пользователей.

Объект Trace

Объект Trace является универсальным-объектом трассировки (и экземпляром класса System.Web.TraceContext). Он позволяет записывать информацию в журнал на уровне страниц. Этот журнал содержит подробную информацию о синхронизации, чтобы вы не только могли видеть объект Trace для отладки, но и использовать его для мониторинга производительности и синхронизации. Более того, журнал трассировки также содержит набор разнообразной информации, организованной в несколько разделов.

Ниже описана вся информация, которую вы увидите:

Информация в журнале трассировки
Раздел Описание
Request Details (Детали запроса) В этом разделе содержится некоторая базовая информация о контексте запроса, в том числе идентификатор текущего сеанса, время совершения веб-запроса, а также тип веб-запроса и кодировка
Trace Information (Трассировочная информация) В этом разделе отображены разные этапы обработки, пройденные страницей перед отправкой клиенту. Каждый раздел содержит дополнительную информацию о том, сколько времени ушло на выполнение с начала первого этапа (From First (С первого)) и с начала предыдущего этапа (From Last (С последнего)). При добавлении собственных сообщений трассировки они также появятся в этом разделе
Control Tree (Дерево элементов управления) Дерево элементов управления отображает все элементы управления страницы с отступами, соответствующими их иерархии, как и в примере с деревом элементов управления, который рассматривался ранее. Полезной особенностью этого раздела является столбец Viewstate, сообщающий количество байт пространства, необходимых для сохранения текущей информации в элементе управления. Это поможет определить, повлияет ли включение состояния элемента управления на время передачи страницы
Session State (Состояние сеанса) и Application State (Состояние приложения) В этих разделах отображается каждый элемент, находящийся в текущем состоянии сеанса либо приложения. Каждый элемент приводится с именем, типом и значением. Если вы сохраняете простую строковую информацию, значение извлекается непосредственно. Если вы сохраняете объект, .NET вызывает метод объекта ToString() для получения соответствующего строкового представления. Для сложных объектов результатом может быть просто имя класса
Cookies Collection (Коллекция cookie-наборов) В этом разделе отображаются все cookie-наборы, отправляемые с запросом, а также содержимое и размер каждого cookie-набора в байтах. Даже если вы явно не создавали cookie-набор, вы увидите cookie-набор ASP.NET_SessionId, содержащий идентификатор текущего сеанса. Если вы используете аутентификацию на основе форм, вы также увидите cookie-набор, связанный с безопасностью.
Headers Collection (Коллекция заголовков) В этом разделе перечислены все HTTP-заголовки, связанные с запросом
Forms Collection (Коллекция форм) В этом разделе перечислена информация обратной отправки форм
QueryString Collection (Коллекция строк запроса) В этом разделе перечислены переменные и значения, передаваемые в строке запроса
Server Variables (Серверные переменные) В этом разделе перечислены все серверные переменные вместе с их содержимым

Трассировка дополняет отладку Visual Studio. Во многих случаях отладка является наилучшим подходом к решению проблем во время кодирования веб-приложения, в то время как трассировка предоставляет лучшую возможность при необходимости поиска и устранения неисправностей, которые появляются во время работы приложения на веб-сервере.

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

Трассировку можно включить двумя способами. В любом месте кода можно установить свойство Trace.IsEnabled в true:

Trace.IsEnabled = true;

Обычно это делается в обработчике событий Page.Load. Другой возможностью является использование атрибута Trace в директиве Page:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ControlTree.aspx.cs" Inherits="ControlTree" 
     Trace="true" TraceMode="SortByCategory" %>

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

На рисунке ниже показан частичный листинг трассировочной информации:

Базовая информация трассировки

Вы также можете записывать свою информацию в журнал трассировки (часть журнала трассировки, которая находится в разделе Trace Information) с использованием метода Trace.Write() или Trace.Warn(). Эти методы эквивалентны. Единственное различие заключается в том, что Warn() отображает сообщение красным цветом, что помогает отделить его от других сообщений.

Ниже показан фрагмент кода, записывающего сообщение трассировки в результате щелчка пользователем на кнопке (на примере удаления кнопки из предыдущей статьи):

protected void cmdRemove_Click(object sender, EventArgs e)
{
        Trace.Write("RemoveButton_Click", "Удаление элемента управления");

        // Поиска кнопки в коллекции Page.Controls
        Button foundButton = (Button)Page.FindControl("newButton"); 
        
        // Удаление кнопки. 
        if (foundButton != null) 
            foundButton.Parent.Controls.Remove(foundButton);

        Trace.Write("RemoveButton_Click", "Кнопка удалена");
}

При записи сообщения трассировки автоматически отправляются всем слушателям трассировки. Если трассировка страницы отключена, эти сообщения просто игнорируются. Сообщения трассировки автоматически кодируются в HTML. Это означает, что дескрипторы вроде <br /> и <Ь> отображаются в виде текста, а не интерпретируются как код HTML.

На рисунке можно видеть новые записи в журнале:

Запись специальных сообщений трассировки

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

Пройди тесты
Лучший чат для C# программистов