Помимо встроенной трассировки (через 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…() не происходит. Как же с этим бороться? Есть три способа, разной степени сложности.

  1. Web Deployment Projects (или любой собственноручно написанный MSBuild-файл). В таком проекте можно поиграться с автоматической заменой web.config’а или с различными опциями компиляции (но только напрямую в тексте файла, графический интерфейс VS2005 этого не умеет).
  2. Web Application Project. По сути это шаблон проекта, позволяющий создавать web-приложения в VS2005 так же, как это делалось в VS2003. К сожалению, при этом мы лишаемся всех бонусов 2005-й студии, типа встроенного веб-сервера для отладки. (Upd.: Web Application Project теперь входит в VS 2005 SP1, отдельно его скачивать не надо).
  3. Правка 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: , ,