Habilitar o rastreamento do SignalR

por Tom FitzMacken

Warning

Esta documentação não é para a versão mais recente do Signalr. Dê uma olhada ASP.NET Core signalr.

Este documento descreve como habilitar e configurar o rastreamento para servidores e clientes do Signalr. O rastreamento permite que você exiba informações de diagnóstico sobre eventos em seu aplicativo Signalr.

Este tópico foi escrito originalmente por Patrick Fletcher.

Versões de software usadas no tutorial

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á lançá-las no fórum do signalr ASP.net ou stackoverflow.com.

Quando o rastreamento está habilitado, um aplicativo Signalr cria entradas de log para eventos. Você pode registrar em log eventos do cliente e do servidor. O rastreamento nos eventos conexão de logs do servidor, provedor de scale out e barramento de mensagem. O rastreamento no cliente registra eventos de conexão. No Signalr 2,1 e posterior, o rastreamento no cliente registra em log o conteúdo completo das mensagens de invocação de Hub.

Conteúdo

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 você 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 do TraceListener.

As categorias de evento do servidor incluem os seguintes tipos de mensagens:

Fonte Mensagens
SignalR.SqlMessageBus Configuração do provedor de escalabilidade de barramento de mensagem SQL, operação de banco de dados, erro e eventos de tempo limite
SignalR.ServiceBusMessageBus Eventos de criação e assinatura, erro e mensagens do tópico do provedor de expansão do barramento de serviço
SignalR.RedisMessageBus Redis de conexão do provedor de escalabilidade, desconexão e eventos de erro
SignalR.ScaleoutMessageBus Eventos de mensagens de scale out
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 Eventos de conexão de transporte, desconexão e KeepAlive
SignalR.ReflectedHubDescriptorProvider Eventos de descoberta de Hub

Registrando eventos de servidor em arquivos de texto

O código a seguir mostra como habilitar o rastreamento para cada categoria de evento. Esta amostra 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 entrada SignalRSwitch especifica a TraceLevel usada para os eventos enviados para o log especificado. Nesse caso, ele é definido como Verbose, o que significa que todas as mensagens de depuração e rastreamento são registradas.

A saída a seguir mostra as entradas do arquivo transports.log.txt 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)

Registrando eventos de 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 nó sharedListeners. O código a seguir mostra como registrar eventos de 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:

Visualizador de Eventos mostrando os logs do Signalr

Note

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 TraceLevel da conexão com um valor de tracelevels e a propriedade TraceWriter como uma instância TextWriter válida.

Registrando eventos do cliente da área de trabalho no console

O código C# a seguir mostra como registrar em log eventos no cliente .net para o console do:

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();

Registrando eventos do 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 as entradas do arquivo ClientLog.txt para um aplicativo usando o arquivo de configuração acima. Ele mostra o cliente que está se conectando ao servidor e o Hub que invoca 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

Os aplicativos signalr para Windows Phone aplicativos usam o mesmo cliente .NET que os aplicativos da área de trabalho, mas o console. out e a gravação em um arquivo com o StreamWriter não estão disponíveis. Em vez disso, você precisa criar uma implementação personalizada de TextWriter para rastreamento.

Registrando 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 TextWriter personalizada chamada TextBlockWriter. Essa classe pode ser encontrada no projeto Samples/Microsoft. AspNet. signaler. Client. WP8. Samples . Ao criar uma instância do TextBlockWriter, passe o SynchronizationContextatual e um StackPanel onde ele criará um TextBlock para usar na saída de rastreamento:

Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;

A saída do rastreamento será então gravada em um novo TextBlock criado no StackPanel que você passou:

Registrando Windows Phone eventos de 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 grave na janela de depuração e atribua-a à propriedade TraceWriter da sua 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
}

As informações de rastreamento serão então gravadas na janela de depuração no Visual Studio:

Habilitando o rastreamento no cliente JavaScript

Para habilitar o log do lado do cliente em uma conexão, defina a propriedade logging no objeto de conexão antes de chamar o método start para estabelecer a conexão.

Código JavaScript do cliente para habilitar o rastreamento para o console do navegador (com o proxy gerado)

$.connection.hub.logging = true;
$.connection.hub.start();

Código JavaScript do cliente para habilitar o rastreamento para o 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 rastreamento habilitado. Ele mostra os eventos de invocação de conexão e de Hub no console do navegador:

Eventos de rastreamento do signalr no console do navegador