Abilitazione della traccia di SignalR

di Tom FitzMacken

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

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:

Visualizzatore eventi che mostra i log SignalR

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:

Screenshot che mostra un esempio di Windows Phone con output nella visualizzazione.

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:

Screenshot che mostra la finestra di dialogo Output. Il debug si trova nel campo Mostra output dal campo .

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:

Eventi di traccia SignalR nella console del browser