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
- Visual Studio 2013
- .NET Framework 4.5
- SignalR, versión 2
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 cliente de .NET (aplicaciones de escritorio de Windows)
Habilitación del seguimiento en los clientes de Windows Phone 8
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:
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ó:
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:
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: