Compartilhar via


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

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:

Visualizador de Eventos mostrando logs do SignalR

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:

Captura de tela que mostra um exemplo de Windows Phone com saída na exibição.

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:

Captura de tela que mostra a caixa de diálogo Saída. A depuração está no campo Mostrar saída de .

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:

Eventos de rastreamento do SignalR no console do navegador