Habilitar o rastreamento do SignalR
por Tom FitzMacken
Aviso
Esta documentação não é para a versão mais recente do SignalR. Dê uma olhada em ASP.NET Core SignalR.
Este documento descreve como habilitar e configurar o rastreamento para clientes e servidores do SignalR. O rastreamento permite exibir informações de diagnóstico sobre eventos em seu aplicativo SignalR.
Este tópico foi originalmente escrito por Patrick Fletcher.
Versões de software usadas no tutorial
- Visual Studio 2013
- .NET Framework 4.5
- SignalR versão 2
Perguntas e comentários
Deixe comentários sobre como você gostou deste tutorial e o que poderíamos melhorar nos comentários na parte inferior da página. Se você tiver dúvidas que não estão diretamente relacionadas ao tutorial, poderá postá-las no fórum do ASP.NET SignalR ou StackOverflow.com.
Quando o rastreamento está habilitado, um aplicativo SignalR cria entradas de log para eventos. Você pode registrar eventos do cliente e do servidor. Rastreamento na conexão de logs do servidor, provedor de expansão e eventos de barramento de mensagens. Rastreamento nos eventos de conexão de logs do cliente. No SignalR 2.1 e posterior, o rastreamento no cliente registra o conteúdo completo das mensagens de invocação do hub.
Sumário
Habilitando o rastreamento no servidor
Você habilita o rastreamento no servidor dentro do arquivo de configuração do aplicativo (App.config ou Web.config dependendo do tipo de projeto).) Especifique quais categorias de eventos deseja registrar. No arquivo de configuração, você também especifica se deseja registrar os eventos em um arquivo de texto, no log de eventos do Windows ou em um log personalizado usando uma implementação de TraceListener.
As categorias de evento do servidor incluem os seguintes tipos de mensagens:
Fonte | Mensagens |
---|---|
SignalR.SqlMessageBus | Configuração do provedor de expansão do Barramento de Mensagens SQL, operação do banco de dados, erro e eventos de tempo limite |
SignalR.ServiceBusMessageBus | Criação de tópico do provedor de expansão do barramento de serviço e eventos de assinatura, erro e mensagens |
SignalR.RedisMessageBus | Conexão, desconexão e eventos de erro do provedor de expansão do Redis |
SignalR.ScaleoutMessageBus | Eventos de mensagens de expansão |
SignalR.Transports.WebSocketTransport | Conexão de transporte WebSocket, desconexão, mensagens e eventos de erro |
SignalR.Transports.ServerSentEventsTransport | Conexão de transporte ServerSentEvents, desconexão, mensagens e eventos de erro |
SignalR.Transports.ForeverFrameTransport | Conexão de transporte ForeverFrame, desconexão, mensagens e eventos de erro |
SignalR.Transports.LongPollingTransport | Conexão de transporte LongPolling, desconexão, mensagens e eventos de erro |
SignalR.Transports.TransportHeartBeat | Conexão de transporte, desconexão e eventos keepalive |
SignalR.ReflectedHubDescriptorProvider | Eventos de descoberta de hub |
Registrar eventos do servidor em arquivos de texto
O código a seguir mostra como habilitar o rastreamento para cada categoria de evento. Este exemplo configura o aplicativo para registrar eventos em arquivos de texto.
Código do servidor XML para habilitar o rastreamento
<system.diagnostics>
<sources>
<source name="SignalR.SqlMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.ServiceBusMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.RedisMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.ScaleoutMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.Transports.WebSocketTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.ServerSentEventsTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.ForeverFrameTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.LongPollingTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.TransportHeartBeat">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.ReflectedHubDescriptorProvider">
<listeners>
<add name="SignalR-Init" />
</listeners>
</source>
</sources>
<!-- Sets the trace verbosity level -->
<switches>
<add name="SignalRSwitch" value="Verbose" />
</switches>
<!-- Specifies the trace writer for output -->
<sharedListeners>
<!-- Listener for transport events -->
<add name="SignalR-Transports" type="System.Diagnostics.TextWriterTraceListener" initializeData="transports.log.txt" />
<!-- Listener for scaleout provider events -->
<add name="SignalR-Bus" type="System.Diagnostics.TextWriterTraceListener" initializeData="bus.log.txt" />
<!-- Listener for hub discovery events -->
<add name="SignalR-Init" type="System.Diagnostics.TextWriterTraceListener" initializeData="init.log.txt" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
No código acima, a SignalRSwitch
entrada especifica o TraceLevel usado para eventos enviados ao log especificado. Nesse caso, ele é definido como, o Verbose
que significa que todas as mensagens de depuração e rastreamento são registradas em log.
A saída a seguir mostra entradas do transports.log.txt
arquivo para um aplicativo usando o arquivo de configuração acima. Ele mostra uma nova conexão, uma conexão removida e eventos de pulsação de transporte.
SignalR.Transports.TransportHeartBeat Information: 0 : Connection 9aa62c9b-09b3-416c-b367-06520e24f780 is New.
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : CloseSocket(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : Abort(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 9aa62c9b-09b3-416c-b367-06520e24f780
SignalR.Transports.WebSocketTransport Information: 0 : End(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Verbose: 0 : DrainWrites(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : CompleteRequest (9aa62c9b-09b3-416c-b367-06520e24f780)
Registrar eventos do servidor no log de eventos
Para registrar eventos no log de eventos em vez de um arquivo de texto, altere os valores das entradas no sharedListeners
nó. O código a seguir mostra como registrar eventos do servidor no log de eventos:
Código do servidor XML para registrar eventos no log de eventos
<sharedListeners>
<!-- Listener for transport events -->
<add name="SignalR-Transports" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRTransportLog" />
<!-- Listener for scaleout provider events -->
<add name="SignalR-Bus" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRScaleoutLog" />
<!-- Listener for hub discovery events -->
<add name="SignalR-Init" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRInitLog" />
</sharedListeners>
Os eventos são registrados no log do aplicativo e estão disponíveis por meio do Visualizador de Eventos, conforme mostrado abaixo:
Observação
Ao usar o log de eventos, defina TraceLevel como Erro para manter o número de mensagens gerenciáveis.
Habilitando o rastreamento no cliente .NET (aplicativos da Área de Trabalho do Windows)
O cliente .NET pode registrar eventos no console, em um arquivo de texto ou em um log personalizado usando uma implementação de TextWriter.
Para habilitar o registro em log no cliente .NET, defina a propriedade da TraceLevel
conexão como um valor TraceLevels e a TraceWriter
propriedade como uma instância textwriter válida.
Registrar eventos de cliente da área de trabalho no console
O código C# a seguir mostra como registrar eventos no cliente .NET no console:
var hubConnection = new HubConnection("http://www.contoso.com/");
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
Registrar eventos de cliente da área de trabalho em um arquivo de texto
O código C# a seguir mostra como registrar eventos no cliente .NET em um arquivo de texto:
var hubConnection = new HubConnection("http://www.contoso.com/");
var writer = new StreamWriter("ClientLog.txt");
writer.AutoFlush = true;
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = writer;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
A saída a seguir mostra entradas do ClientLog.txt
arquivo para um aplicativo usando o arquivo de configuração acima. Ele mostra o cliente se conectando ao servidor e o hub invocando um método de cliente chamado addMessage
:
19:41:39.9103763 - null - ChangeState(Disconnected, Connecting)
19:41:40.3750726 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS Connecting to: ws://localhost:8080/signalr/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAh8Lp
KH5%2FDkCQeR4ALAwR%2BAAAAAACAAAAAAADZgAAwAAAABAAAADHpCa7wm%2FbOhjluf%2Fm9GA9AAAAAASAAACgAAAAEA
AAAEqRfJihLExRI6tZy7lWRwYoAAAApotSsJXW0OiwEgiUUi0pzhK6oKbz%2BkMeVbezuEDQLnJecM9otFe9PRQAAAAuHK
BlOnPmXt%2FhXV%2Felr1QvC156Q%3D%3D&connectionData=[{"Name":"MyHub"}]
19:41:40.4442923 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,0|B,0|C,1|D,0","S":1,"M":[]})
19:41:40.4874324 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - ChangeState(Connecting, Connected)
19:41:47.4511770 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,1|B,0|C,1|D,0","M":[{"H":"MyHub","M":"addMessage","A":["User One","Hello!"]}]})
19:41:47.4576968 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"I":"0"})
19:41:50.3959119 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({})
19:41:50.8928084 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,2|B,0|C,1|D,0","M":[{"H":"MyHub","M":"addMessage","A":["User Two","Hello!"]}]})
Habilitando o rastreamento em clientes Windows Phone 8
Aplicativos SignalR para aplicativos Windows Phone usam o mesmo cliente .NET que aplicativos da área de trabalho, mas Console.Out e gravação em um arquivo com StreamWriter não estão disponíveis. Em vez disso, você precisa criar uma implementação personalizada do TextWriter para rastreamento.
Registrar Windows Phone eventos de cliente na interface do usuário
A base de código do SignalR inclui um exemplo de Windows Phone que grava a saída de rastreamento em um TextBlock usando uma implementação personalizada do TextWriter chamada TextBlockWriter
. Essa classe pode ser encontrada no projeto samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Ao criar uma instância do TextBlockWriter
, passe o SynchronizationContext atual e um StackPanel em que ele criará um TextBlock a ser usado para a saída de rastreamento:
Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;
Em seguida, a saída de rastreamento será gravada em um novo TextBlock criado no StackPanel que você passou:
Registrar Windows Phone eventos do cliente no console de depuração
Para enviar a saída para o console de depuração em vez da interface do usuário, crie uma implementação de TextWriter que grava na janela de depuração e atribua-a à propriedade TraceWriter da conexão:
Connection = new HubConnection(ServerURI);
var writer = new DebugTextWriter();
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;
...
private class DebugTextWriter : TextWriter
{
private StringBuilder buffer;
public DebugTextWriter()
{
buffer = new StringBuilder();
}
public override void Write(char value)
{
switch (value)
{
case '\n':
return;
case '\r':
Debug.WriteLine(buffer.ToString());
buffer.Clear();
return;
default:
buffer.Append(value);
break;
}
}
public override void Write(string value)
{
Debug.WriteLine(value);
}
#region implemented abstract members of TextWriter
public override Encoding Encoding
{
get { throw new NotImplementedException(); }
}
#endregion
}
Em seguida, as informações de rastreamento serão gravadas na janela de depuração no Visual Studio:
Habilitando o rastreamento em cliente JavaScript
Para habilitar o log do lado do cliente em uma conexão, defina a logging
propriedade no objeto de conexão antes de chamar o start
método para estabelecer a conexão.
Código JavaScript do cliente para habilitar o rastreamento no console do navegador (com o proxy gerado)
$.connection.hub.logging = true;
$.connection.hub.start();
Código JavaScript do cliente para habilitar o rastreamento no console do navegador (sem o proxy gerado)
var connection = $.hubConnection();
connection.logging = true;
connection.start();
Quando o rastreamento está habilitado, o cliente JavaScript registra eventos no console do navegador. Para acessar o console do navegador, consulte Monitoramento de transportes.
A captura de tela a seguir mostra um cliente JavaScript do SignalR com o rastreamento habilitado. Ele mostra eventos de invocação de conexão e hub no console do navegador: