Através do ASP.NET Trace podemos obter várias informações de uma requisição. Esta funcionalidade permite ainda que adicionemos informações de depuração nas nossas aplicações e não será necessário retirá-las quando colocarmos nossa aplicação em produção.
Para utilizarmos desse funcionalidade, temos que habilitar o trace, fazendo isso o ASP.NET já adiciona várias informações para diagnóstico do trace, o ASP.NET também adiciona as mensagens customizadas que tenhamos colocado.
Todas as mensagens podem ser analisadas na própria página requisitada, ou através de uma página separada, onde é possível analisar um histórico de requisições.
Habilitando Trace por página
Podemos habilitar o trace de uma página adicionando o atributo e valor Trace=”true” na diretiva da página @Page, conforme código 1.
<%@Page Language="C#" AutoEventWireup="true" CodeFile="TraceDaPagina.aspx.cs" Inherits="TraceDaPagina" Trace="true" %>
Código 1 – Habilitando o trace da página
Ao executar nossa aplicação e requisitar esta página nos será exibido o retorno de nossa página e adicionado ao final várias informações sobre a requisição, conforme Imagem 1:
O ASP.NET já adiciona várias informações para que possamos analisar a requisição. Há informações de detalhes da requisição, como data, hora, id da sessão, tipo de requisição e outros. Na seção Trace Information podemos ver os vários métodos da página e o tempo gasto em cada um deles, desta forma poderíamos analisar se algum método está gastando muito tempo e ver se este está fazendo algum processamento desnecessário.
É possível ver também a hierarquia de controles da página e o tamanho em Bytes que cada controle gera. Temos informações de sessão, aplicação, cookie, cabeçalho da requisição e da resposta e várias outras.
Dica de segurança: Quando o trace está ativo, várias informações estão disponíveis para os usuários da aplicação. Tenha a certeza que o trace esteja desabilitado quando a aplicação estiver em produção.
Escrevendo informações customizadas
O ASP.NET disponibiliza o objeto Trace, que é do tipo TraceContext, disponível em vários contextos. Na página podemos utilizar Page.Trace, no global.asax podemos utilizar o HttpContext.Current.Trace.
O TraceContext disponibiliza dois métodos, Write e Warn, que adicionam mensagens ao log do trace, o último adiciona mensagens em vermelho no trace. Estes métodos são sobrecarregados e possuem várias formas de utiliza-los com os diferentes parâmetros. É possível ainda utilizar a propriedade IsEnabled para saber se o trace está habilitado ou não.
No código 1, abaixo, são utilizados os métodos e a propriedade citadas. É chamado também o método Thread.sleep que recebe um número de milisegundos que é o tempo que a thread responsável pela execução da requisição será colocada para dormir.
public partial class TraceDaPagina : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Trace.IsEnabled)
{
Trace.Warn("Testando performance", "Começo do teste");
Trace.Write("Testando performance", "Antes de dormir");
Thread.Sleep(2000);
Trace.Write("Testando performance", "Após o for");
}
}
Código 1 – Utilizando o objeto Trace
Veja como isto aparece nas informações do Trace na imagem 2.

Imagem 2 - Adicionando informações ao Trace
Definindo Trace para toda aplicação
Já vimos que é possível configurar o trace individualmente nas páginas. Outra possibilidade é configurarmos o trace para toda aplicação. Para isto basta configurarmos o elemento trace do web.config, quando configurado, o ASP.NET armazena informações de traces até o número máximo de requisições que definirmos. O padrão são 10 requisições, que pode ser alterado e armazendo as mais recentes ou as mais antigas.
Podemos habilitar o trace para toda aplicação e posteriormente desativar o trace por página, também utilizando o atributo Trace da diretiva @Page. Veja o código 2 um exemplo:
<configuration>
<system.web>
<trace localonly="true" requestlimit="40" enabled="true"></trace>
</system.web>
</configuration>
Código 2 – Configurando trace no web.config
Habilitando o trace desta maneira você poderá visualizar as informações de trace por requisição através do recurso trace.axd. conforme Imagem 3.

Imagem 3 - Trace.axd
Os atributos configuráveis no elemento trace do web.config são:
Attribute | Description |
enabled | Padrão false, true para habilitar o trace por aplicação. |
pageOutput | Padrão false, true para mostrar informações de trace na página requisitada e no visualizador de trace(trace.axd). |
requestLimit | Padrão 10. Número de requisições com informações de trace para serem armazenadas no servidor. |
traceMode | Padrão SortByTime. Se ordena as informações de trace por data e hora(SortByTime) ou por categoria(SortByCategory). |
localOnly | Padrão true. Se o visualizador de trace está disponível somente na máquina Web server. |
mostRecent | Padrão false, true para mostrar as informações de trace mais recentes, desta forma ao atingir o requestLimit, as requisições mais antigas darão lugar as requisições mais recentes. |
Idéia de prática
O try, catch e finally é um recurso interessante para tratamento de exceção, sabe o que o trace de uma requisição a uma página, que teria o o código 3 em seu codebehind mostraria?
protected void Page_Load(object sender, EventArgs e)
{
LoopDeDivisoes();
}
public void LoopDeDivisoes()
{
Trace.Warn("Entrou no Loop de Divisoes");
for (int i = 5; i >= 0; i--)
{
int retorno = ResultadoDaDivisao(10, i);
Trace.Write(string.Format("Retorno do método {0}", retorno));
}
}
protected int ResultadoDaDivisao(int valorA, int valorB)
{
int resultadoDivisao = -1;
Trace.Write(string.Format("{0} / {1}", valorA, valorB));
try
{
resultadoDivisao = valorA / valorB;
Trace.Write(string.Format("Resultado: {0}", resultadoDivisao));
return resultadoDivisao;
}
catch (DivideByZeroException)
{
Trace.Write("Erro de divisão por 0");
throw;
}
finally
{
Trace.Write("Finally do Resultado da divisão");
}
}
Código 3 – Prática de trace manipulando exceções
Trace
http://msdn2.microsoft.com/en-us/library/system.diagnostics.trace.aspx
http://msdn2.microsoft.com/en-us/library/kthye016.aspx
http://msdn2.microsoft.com/en-us/library/1y89ed7z.aspx
http://msdn2.microsoft.com/en-us/library/y13fw6we%28VS.71%29.aspx