06.08.2007Трассировка и отладка в ASP.NET 2.0
Помимо встроенной трассировки (через TraceContext), в ASP.NET можно использовать стандартные возможности трассировки, предоставляемые .NET Framework’ом. К таковым относятся классы System.Diagnostics.Trace и System.Diagnostics.Debug. Каждый из этих классов содержит одинаковый набор статических методов (Write, WriteLine и т.п.), отмеченных атрибутом ConditionalAttribute. Атрибут работает следующим образом: если при компиляции символ, который был ему передан в качестве параметра, не определен, то все вызовы метода, на котором висит атрибут, зануляются (преобразуются в nop). Для методов класса Debug атрибут ConditionalAttribute инициализирован символом “DEBUG“, для Trace - соответственно, “TRACE“.
По умолчанию, для обычных проектов (WinApp, Library и т.п.) в конфигурации Debug определены оба символа, а в Release - только символ TRACE. Увы и ах, но это правило не распространяется на веб-проекты в Visual Studio 2005. Связано это с несколько извратной моделью компиляции веб-сайта, но вдаваться в подробности я не хочу. Скажу только, что по умолчанию, символ TRACE не определен ни в режиме сборки Debug, ни в Release, т.е. вызов к System.Diagnostics.Trace.Write…() не происходит. Как же с этим бороться? Есть три способа, разной степени сложности.
- Web Deployment Projects (или любой собственноручно написанный MSBuild-файл). В таком проекте можно поиграться с автоматической заменой web.config’а или с различными опциями компиляции (но только напрямую в тексте файла, графический интерфейс VS2005 этого не умеет).
- Web Application Project. По сути это шаблон проекта, позволяющий создавать web-приложения в VS2005 так же, как это делалось в VS2003. К сожалению, при этом мы лишаемся всех бонусов 2005-й студии, типа встроенного веб-сервера для отладки. (Upd.: Web Application Project теперь входит в VS 2005 SP1, отдельно его скачивать не надо).
- Правка web.config’а нашего приложения. Для определения символа TRACE к нему надо добавить вот такой кусок кода (внутрь элемента
):
<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/d:TRACE" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="1" /> <compiler language="VB" extension=".vb" compilerOptions="/d:Trace=true" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </compilers> </system.codedom>
Таким же образом можно определять и другие символы (помимо DEBUG и TRACE). Есть только одна проблема: содержимое web.config’а не зависит от режима сборки (Debug/Release/…). В более сложных ситуациях может потребоваться несколько его копий, либо скрипт, заменяющий содержимое в зависимости от режима сборки проекта.
Трассировка веб-приложения, которая является крайне удобным средством отладки и мониторинга, выключена по умолчанию в VS 2005. К счастью, есть несколько вариантов решения этой проблемы; выбор одно из них зависит от условий разработки и личных предпочтений программиста. Надеюсь, что информация в этой записи позволит кому-то сэкономить несколько седых волос с головы и мучительных часов в отладке.
Technorati Tags: ASP.NET, Trace, Visual Studio
