Abilitazione della traccia di SignalR
Avviso
Questa documentazione non è per la versione più recente di SignalR. Esaminare ASP.NET Core SignalR.
Questo documento descrive come abilitare e configurare la traccia per i server e i client SignalR. La traccia consente di visualizzare informazioni di diagnostica sugli eventi nell'applicazione SignalR.
Questo argomento è stato originariamente scritto da Patrick Fletcher.
Versioni software usate nell'esercitazione
- Visual Studio 2013
- .NET Framework 4.5
- SignalR versione 2
Domande e commenti
Lasciare commenti e suggerimenti su come è piaciuta questa esercitazione e ciò che è possibile migliorare nei commenti nella parte inferiore della pagina. Se si hanno domande che non sono direttamente correlate all'esercitazione, è possibile pubblicarli nel forum ASP.NET SignalR o StackOverflow.com.
Quando la traccia è abilitata, un'applicazione SignalR crea voci di log per gli eventi. È possibile registrare eventi sia dal client che dal server. Traccia sulla connessione, il provider di scalabilità orizzontale e gli eventi del bus di messaggio nel server. Traccia sugli eventi di connessione dei log client. In SignalR 2.1 e versioni successive traccia nel client registra il contenuto completo dei messaggi di chiamata dell'hub.
Contenuto
Abilitazione della traccia nel server
È possibile abilitare la traccia nel server all'interno del file di configurazione dell'applicazione (App.config o Web.config a seconda del tipo di progetto. Specificare quali categorie di eventi si desidera registrare. Nel file di configurazione specificare anche se registrare gli eventi in un file di testo, nel registro eventi di Windows o in un log eventi personalizzato usando un'implementazione di TraceListener.
Le categorie di eventi del server includono i seguenti tipi di messaggi:
Source (Sorgente) | Messaggi |
---|---|
SignalR.SqlMessageBus | Configurazione del provider di scalabilità del bus di messaggi SQL, operazione del database, errore e timeout |
SignalR.ServiceBusMessageBus | Argomenti di creazione e sottoscrizione del provider di scalabilità del bus di servizio, errori e eventi di messaggistica |
SignalR.RedisMessageBus | Connessione del provider di scalabilità Redis, disconnessione ed eventi di errore |
SignalR.ScaleoutMessageBus | Eventi di messaggistica scaleout |
SignalR.Transports.WebSocketTransport | Connessione di trasporto WebSocket, disconnessione, messaggistica ed eventi di errore |
SignalR.Transports.ServerSentEventsTransport | Connessione di trasporto ServerSentEvents, disconnessione, messaggistica ed eventi di errore |
SignalR.Transports.ForeverFrameTransport | Connessione trasporto ForeverFrame, disconnessione, messaggistica ed eventi di errore |
SignalR.Transports.LongPollingTransport | Connessione di trasporto LongPolling, disconnessione, messaggistica ed eventi di errore |
SignalR.Transports.TransportHeartBeat | Connessione di trasporto, disconnessione e eventi keepalive |
SignalR.ReflectionHubDescriptorProvider | Eventi di individuazione hub |
Registrazione degli eventi del server nei file di testo
Il codice seguente illustra come abilitare la traccia per ogni categoria di evento. Questo esempio configura l'applicazione per registrare gli eventi nei file di testo.
Codice server XML per abilitare la traccia
<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>
Nel codice precedente, la SignalRSwitch
voce specifica TraceLevel utilizzata per gli eventi inviati al log specificato. In questo caso, è impostato su Verbose
cui vengono registrati tutti i messaggi di debug e traccia.
L'output seguente mostra le voci del file per un'applicazione usando il transports.log.txt
file di configurazione precedente. Mostra una nuova connessione, una connessione rimossa e eventi heartbeat di trasporto.
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)
Registrazione degli eventi del server nel registro eventi
Per registrare gli eventi nel registro eventi anziché un file di testo, modificare i valori per le voci nel sharedListeners
nodo. Il codice seguente illustra come registrare gli eventi del server nel registro eventi:
Codice server XML per la registrazione degli eventi nel registro eventi
<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>
Gli eventi vengono registrati nel log dell'applicazione e sono disponibili tramite la Visualizzatore eventi, come illustrato di seguito:
Nota
Quando si usa il registro eventi, impostare TraceLevel su Error per mantenere il numero di messaggi gestibili.
Abilitazione della traccia nel client .NET (app Desktop di Windows)
Il client .NET può registrare gli eventi nella console, un file di testo o un log personalizzato usando un'implementazione di TextWriter.
Per abilitare la registrazione nel client .NET, impostare la proprietà della TraceLevel
connessione su un valore TraceLevels e la TraceWriter
proprietà su un'istanza di TextWriter valida.
Registrazione degli eventi client desktop nella console
Il codice C# seguente illustra come registrare gli eventi nel client .NET nella 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();
Registrazione degli eventi client desktop in un file di testo
Il codice C# seguente illustra come registrare gli eventi nel client .NET in un file di testo:
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();
L'output seguente mostra le voci del file per un'applicazione usando il ClientLog.txt
file di configurazione precedente. Mostra il client che si connette al server e l'hub richiama un metodo client denominato 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!"]}]})
Abilitazione della traccia in Windows Phone 8 client
Le applicazioni SignalR per le app Windows Phone usano lo stesso client .NET delle app desktop, ma Console.Out e la scrittura in un file con StreamWriter non sono disponibili. È invece necessario creare un'implementazione personalizzata di TextWriter per la traccia.
Registrazione di eventi client Windows Phone nell'interfaccia utente
La codebase signalR include un esempio di Windows Phone che scrive l'output di traccia in un oggetto TextBlock usando un'implementazione di TextWriter personalizzata denominata TextBlockWriter
. Questa classe è disponibile nel progetto samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Quando si crea un'istanza di TextBlockWriter
, passare all'oggetto SyncContext corrente e a StackPanel in cui verrà creato un oggetto TextBlock da usare per l'output di traccia:
Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;
L'output di traccia verrà quindi scritto in un nuovo TextBlock creato in StackPanel passato:
Registrazione Windows Phone eventi client nella console di debug
Per inviare l'output alla console di debug anziché all'interfaccia utente, creare un'implementazione di TextWriter che scrive nella finestra di debug e assegnarla alla proprietà TraceWriter della connessione:
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
}
Le informazioni di traccia verranno quindi scritte nella finestra di debug in Visual Studio:
Abilitazione della traccia nel client JavaScript
Per abilitare la registrazione lato client in una connessione, impostare la logging
proprietà sull'oggetto connessione prima di chiamare il start
metodo per stabilire la connessione.
Codice JavaScript client per abilitare la traccia nella console del browser (con il proxy generato)
$.connection.hub.logging = true;
$.connection.hub.start();
Codice JavaScript client per abilitare la traccia nella console del browser (senza il proxy generato)
var connection = $.hubConnection();
connection.logging = true;
connection.start();
Quando la traccia è abilitata, il client JavaScript registra gli eventi nella console del browser. Per accedere alla console del browser, vedere Monitoraggio dei trasporti.
Lo screenshot seguente mostra un client JavaScript SignalR con traccia abilitata. Mostra gli eventi di chiamata alla connessione e all'hub nella console del browser: