Habilitación del seguimiento de SignalR

por Tom FitzMacken

Advertencia

Esta documentación no es para la última versión de SignalR. Eche un vistazo a ASP.NET Core SignalR.

En este documento se describe cómo habilitar y configurar el seguimiento para los clientes y servidores de SignalR. El seguimiento le permite ver información de diagnóstico sobre los eventos en la aplicación SignalR.

Este tema fue escrito originalmente por Patrick Fletcher.

Versiones de software usadas en el tutorial

Preguntas y comentarios

Deje sus comentarios sobre cómo le gustó este tutorial y lo que podríamos mejorar en los comentarios en la parte inferior de la página. Si tiene preguntas que no están directamente relacionadas con el tutorial, puede publicarlas en el foro de ASP.NET SignalR o StackOverflow.com.

Cuando se habilita el seguimiento, una aplicación SignalR crea entradas de registro para eventos. Puede registrar eventos desde el cliente y el servidor. Seguimiento de los eventos de conexión de registros del servidor, proveedor de escalado y bus de mensajes. El seguimiento en el cliente registra eventos de conexión. En SignalR 2.1 y versiones posteriores, el seguimiento en el cliente registra el contenido completo de los mensajes de invocación del hub.

Contenido

Habilitación del seguimiento en el servidor

Puede habilitar el seguimiento en el servidor dentro del archivo de configuración de la aplicación (ya sea App.config o Web.config en función del tipo de proyecto). Especifique qué categorías de eventos desea registrar. En el archivo de configuración, también se especifica si se van a registrar los eventos en un archivo de texto, el registro de eventos de Windows o un registro personalizado mediante una implementación de TraceListener.

Las categorías de eventos de servidor incluyen los siguientes tipos de mensajes:

Fuente Mensajes
SignalR.SqlMessageBus Configuración del proveedor de escalado horizontal de SQL Message Bus, operación de base de datos, error y eventos de tiempo de espera
SignalR.ServiceBusMessageBus Evento de creación de temas, suscripción, error y mensajería del proveedor de escalabilidad horizontal de Service Bus
SignalR.RedisMessageBus Eventos de conexión, desconexión y error del proveedor de escalamiento horizontal de Redis
SignalR.ScaleoutMessageBus Eventos de mensajería de escalabilidad horizontal
SignalR.Transports.WebSocketTransport Conexión de transporte de WebSocket, desconexión, mensajería y eventos de error
SignalR.Transports.ServerSentEventsTransport Eventos de conexión, desconexión, mensajería y errores del transporte ServerSentEvents
SignalR.Transports.ForeverFrameTransport Eventos de conexión, desconexión, mensajería y error de transporte ForeverFrame
SignalR.Transports.LongPollingTransport Conexión, desconexión, mensajería y eventos de error del transporte LongPolling
SignalR.Transports.TransportHeartBeat Conexión de transporte, desconexión y eventos keepalive
SignalR.ReflectedHubDescriptorProvider Eventos de detección de hub

Registro de eventos del servidor en archivos de texto

En el código siguiente se muestra cómo habilitar el seguimiento para cada categoría de evento. En este ejemplo se configura la aplicación para registrar eventos en archivos de texto.

Código de servidor XML para habilitar el seguimiento

<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>

En el código anterior, la SignalRSwitch entrada especifica el elemento TraceLevel usado para los eventos enviados al registro especificado. En este caso, se establece Verbose en , lo que significa que se registran todos los mensajes de depuración y seguimiento.

La siguiente salida muestra entradas del archivo transports.log.txt para una aplicación que utiliza el archivo de configuración anterior. Muestra una nueva conexión, una conexión eliminada y eventos de latido 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)

Registro de eventos del servidor en el registro de eventos

Para registrar eventos en el registro de eventos en lugar de en un archivo de texto, cambie los valores de las entradas del sharedListeners nodo. En el código siguiente se muestra cómo registrar eventos del servidor en el registro de eventos:

Código de servidor XML para registrar eventos en el registro 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>

Los eventos se registran en el registro de aplicaciones y están disponibles a través del Visor de eventos, como se muestra a continuación:

Visor de eventos que muestra los registros de SignalR

Nota:

Al usar el registro de eventos, establezca TraceLevel enError para mantener el número de mensajes administrables.

Habilitación del seguimiento en el cliente de .NET (aplicaciones de escritorio de Windows)

El cliente .NET puede registrar eventos en la consola, un archivo de texto o en un registro personalizado mediante una implementación de TextWriter.

Para habilitar el registro en el cliente .NET, establezca la propiedad TraceLevel de la conexión en un valor TraceLevels y la propiedad TraceWriter en una instancia válida de TextWriter.

Registro de eventos de cliente de escritorio en la consola

El código de C# siguiente muestra cómo registrar eventos en el cliente de .NET en la consola:

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

Registro de eventos de cliente de escritorio en un archivo de texto

El código de C# siguiente muestra cómo registrar eventos en el cliente de .NET en un archivo 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();

En la siguiente salida se muestran las entradas del archivo ClientLog.txt de una aplicación usando el archivo de configuración anterior. Muestra el cliente que se conecta al servidor y el centro invoca un método de cliente denominado 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!"]}]})

Habilitación del seguimiento en clientes de Windows Phone 8

Las aplicaciones SignalR para aplicaciones de Windows Phone usan el mismo cliente de .NET que las aplicaciones de escritorio, pero Console.Out y escritura en un archivo con StreamWriter no están disponibles. En su lugar, debe crear una implementación personalizada de TextWriter para el seguimiento.

Registro de eventos de cliente de Windows Phone en la interfaz de usuario

El código base de SignalR incluye un ejemplo de Windows Phone que escribe la salida de seguimiento en un TextBlock mediante una implementación de TextWriter personalizada denominada TextBlockWriter. Esta clase se puede encontrar en el proyecto samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Al crear una instancia de TextBlockWriter, pase el SynchronizationContext actual y un StackPanel en el que se creará un TextBlock que se usará para la salida de seguimiento:

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

A continuación, la salida del seguimiento se escribirá en un nuevo TextBlock creado en el StackPanel que ha pasado:

Captura de pantalla que muestra un ejemplo de Windows Phone con salida en la pantalla.

Registro de eventos de cliente de Windows Phone en la consola de depuración

Para enviar la salida a la consola de depuración en lugar de a la interfaz de usuario, cree una implementación de TextWriter que escriba en la ventana de depuración y asígnela a la propiedad TraceWriter de la conexión:

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
}

A continuación, la información de seguimiento se escribirá en la ventana de depuración en Visual Studio:

Captura de pantalla que muestra el cuadro de diálogo Salida. La depuración se encuentra en el campo Mostrar salida de .

Habilitación del seguimiento en el cliente de JavaScript

Para habilitar el registro en el lado del cliente para una conexión, establezca la propiedad logging en el objeto de conexión antes de llamar al método start para establecer la conexión.

Código JavaScript de cliente para habilitar el seguimiento en la consola del explorador (con el proxy generado)

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

Código JavaScript de cliente para habilitar el seguimiento en la consola del explorador (sin el proxy generado)

var connection = $.hubConnection();
connection.logging = true;
connection.start();

Cuando se habilita el seguimiento, el cliente de JavaScript registra eventos en la consola del explorador. Para acceder a la consola del navegador, consulte Supervisión de transportes.

En la captura de pantalla siguiente se muestra un cliente javaScript de SignalR con el seguimiento habilitado. Muestra los eventos de conexión e invocación de concentrador en la consola del navegador:

Eventos de seguimiento de SignalR en la consola del explorador