Compartir a través de


Habilitar el seguimiento de SignalR

por Tom FitzMacken

Advertencia

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

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 lo escribió originalmente Patrick Fletcher.

Versiones de software usadas en el tutorial

Preguntas y comentarios

Deje sus comentarios sobre este tutorial y sobre lo que podríamos mejorar en los comentarios en la parte inferior de la página. Si tiene alguna pregunta que no esté directamente relacionadas con el tutorial, puede publicarla en el foro de ASP.NET SignalR o en 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. El seguimiento en el servidor registra la conexión, el proveedor de escalabilidad horizontal y los eventos del 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 centro de conectividad.

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 (App.config o Web.config según el tipo de proyecto). Especifique qué categorías de eventos quiere 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:

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

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 entrada SignalRSwitch especifica el elemento TraceLevel usado para los eventos enviados al registro especificado. En este caso, se establece en Verbose, lo que significa que se registran todos los mensajes de depuración y seguimiento.

En la salida siguiente se muestran las entradas del archivo transports.log.txt de una aplicación mediante 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 nodo sharedListeners. 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:

Event Viewer showing SignalR logs

Nota:

Al usar el registro de eventos, establezca TraceLevel en Error 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 de TextWriter válida.

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 salida siguiente se muestran las entradas del archivo ClientLog.txt de una aplicación mediante el archivo de configuración anterior. Muestra el cliente que se conecta al servidor y el centro de conectividad 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 los clientes de Windows Phone 8

Las aplicaciones de SignalR para aplicaciones de Windows Phone usan el mismo cliente de .NET que las aplicaciones de escritorio, pero Console.Out y la 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 SynchronizationContext actual y un StackPanel donde 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 StackPanel que pasó:

Screenshot that shows a Windows Phone sample with output in the display.

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:

Screenshot that shows the Output dialog box. Debug is in the Show output from field.

Habilitación del seguimiento en el cliente de JavaScript

Para habilitar el registro del lado del cliente en 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 explorador, 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 invocación de conexión y de centro de conectividad en la consola del explorador:

SignalR tracing events in the browser console