Aktivieren der Ablaufverfolgung für SignalR

von Tom FitzMacken

Warnung

Diese Dokumentation ist nicht für die neueste Version von SignalR vorgesehen. Sehen Sie sich ASP.NET Core SignalR an.

In diesem Dokument wird beschrieben, wie Sie die Ablaufverfolgung für SignalR-Server und -Clients aktivieren und konfigurieren. Mit der Ablaufverfolgung können Sie Diagnoseinformationen zu Ereignissen in Ihrer SignalR-Anwendung anzeigen.

Dieses Thema wurde ursprünglich von Patrick Fletcher geschrieben.

Im Tutorial verwendete Softwareversionen

Fragen und Kommentare

Bitte hinterlassen Sie Feedback darüber, wie Ihnen dieses Tutorial gefallen hat und was wir in den Kommentaren unten auf der Seite verbessern könnten. Wenn Sie Fragen haben, die sich nicht direkt auf das Tutorial beziehen, können Sie diese im ASP.NET SignalR-Forum oder im StackOverflow.com posten.

Wenn die Ablaufverfolgung aktiviert ist, erstellt eine SignalR-Anwendung Protokolleinträge für Ereignisse. Sie können Ereignisse sowohl vom Client als auch vom Server protokollieren. Die Ablaufverfolgung auf dem Server protokolliert Verbindungs-, Skalierungsanbieter- und Nachrichtenbusereignisse. Die Ablaufverfolgung auf dem Client protokolliert Verbindungsereignisse. In SignalR 2.1 und höher protokolliert die Ablaufverfolgung auf dem Client den vollständigen Inhalt von Hubaufrufnachrichten.

Inhalte

Aktivieren der Ablaufverfolgung auf dem Server

Sie aktivieren die Ablaufverfolgung auf dem Server in der Konfigurationsdatei der Anwendung (je nach Projekttyp entweder App.config oder Web.config). Sie geben an, welche Kategorien von Ereignissen Sie protokollieren möchten. In der Konfigurationsdatei geben Sie auch an, ob die Ereignisse mithilfe einer Implementierung von TraceListener in einer Textdatei, im Windows-Ereignisprotokoll oder in einem benutzerdefinierten Protokoll protokolliert werden sollen.

Die Serverereigniskategorien umfassen die folgenden Arten von Nachrichten:

Quelle Meldungen
SignalR.SqlMessageBus Setup des SQL Message Bus-Skalierungsanbieters, Datenbankvorgang, Fehler und Timeoutereignisse
SignalR.ServiceBusMessageBus Themenerstellung und Abonnement, Fehler und Messagingereignisse des Service Bus-Skalierungsanbieters
SignalR.RedisMessageBus Verbindungs-, Trennungs- und Fehlerereignisse des Redis-Skalierungsanbieters
SignalR.ScaleoutMessageBus Messagingereignisse für horizontales Skalieren
SignalR.Transports.WebSocketTransport WebSocket-Transportverbindungs-, Trennungs-, Messaging- und Fehlerereignisse
SignalR.Transports.ServerSentEventsTransport ServerSentEvents-Transportverbindungs-, Trennungs-, Messaging- und Fehlerereignisse
SignalR.Transports.ForeverFrameTransport ForeverFrame-Transportverbindung, Trennung, Messaging und Fehlerereignisse
SignalR.Transports.LongPollingTransport LongPolling-Transportverbindung, Trennung, Messaging und Fehlerereignisse
SignalR.Transports.TransportHeartBeat Transport von Verbindungs-, Trennungs- und Keepalive-Ereignissen
SignalR.ReflectedHubDescriptorProvider Hubermittlungsereignisse

Protokollieren von Serverereignissen in Textdateien

Der folgende Code zeigt, wie Sie die Ablaufverfolgung für jede Ereigniskategorie aktivieren. In diesem Beispiel wird die Anwendung so konfiguriert, dass Ereignisse in Textdateien protokolliert werden.

XML-Servercode zum Aktivieren der Ablaufverfolgung

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

Im obigen Code gibt der Eintrag den SignalRSwitchTraceLevel an, der für Ereignisse verwendet wird, die an das angegebene Protokoll gesendet werden. In diesem Fall ist sie auf Verbose festgelegt, was bedeutet, dass alle Debug- und Ablaufverfolgungsmeldungen protokolliert werden.

Die folgende Ausgabe zeigt Einträge aus der transports.log.txt Datei für eine Anwendung, die die obige Konfigurationsdatei verwendet. Es werden eine neue Verbindung, eine entfernte Verbindung und Transporttaktereignisse angezeigt.

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)

Protokollieren von Serverereignissen im Ereignisprotokoll

Um Ereignisse im Ereignisprotokoll und nicht in einer Textdatei zu protokollieren, ändern Sie die Werte für die Einträge im sharedListeners Knoten. Der folgende Code zeigt, wie Serverereignisse im Ereignisprotokoll protokolliert werden:

XML-Servercode zum Protokollieren von Ereignissen im Ereignisprotokoll

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

Die Ereignisse werden im Anwendungsprotokoll protokolliert und sind über die Ereignisanzeige verfügbar, wie unten gezeigt:

Ereignisanzeige mit SignalR-Protokollen

Hinweis

Wenn Sie das Ereignisprotokoll verwenden, legen Sie TraceLevel auf Fehler fest, um die Anzahl der Nachrichten zu verwalten.

Aktivieren der Ablaufverfolgung im .NET-Client (Windows Desktop-Apps)

Der .NET-Client kann Ereignisse mithilfe einer Implementierung von TextWriter in der Konsole, in einer Textdatei oder in einem benutzerdefinierten Protokoll protokollieren.

Um die Protokollierung im .NET-Client zu aktivieren, legen Sie die Eigenschaft der Verbindung TraceLevel auf einen TraceLevels-Wert und die TraceWriter -Eigenschaft auf einen gültigen TextWriter-instance fest.

Protokollieren von Desktopclientereignissen in der Konsole

Der folgende C#-Code zeigt, wie Ereignisse im .NET-Client in der Konsole protokolliert werden:

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

Protokollieren von Desktopclientereignissen in einer Textdatei

Der folgende C#-Code zeigt, wie Ereignisse im .NET-Client in einer Textdatei protokolliert werden:

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

Die folgende Ausgabe zeigt Einträge aus der ClientLog.txt Datei für eine Anwendung, die die obige Konfigurationsdatei verwendet. Es zeigt den Client, der eine Verbindung mit dem Server herstellt, und der Hub, der eine Clientmethode namens aufruft 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!"]}]})

Aktivieren der Ablaufverfolgung in Windows Phone 8-Clients

SignalR-Anwendungen für Windows Phone-Apps verwenden denselben .NET-Client wie Desktop-Apps, aber Console.Out und Schreiben in eine Datei mit StreamWriter sind nicht verfügbar. Stattdessen müssen Sie eine benutzerdefinierte Implementierung von TextWriter für die Ablaufverfolgung erstellen.

Protokollieren Windows Phone Clientereignissen auf der Benutzeroberfläche

Die SignalR-Codebasis enthält ein Windows Phone Beispiel, das die Ablaufverfolgungsausgabe mithilfe einer benutzerdefinierten TextWriter-Implementierung namens in TextBlockWritereinen TextBlock schreibt. Diese Klasse finden Sie im Projekt samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Wenn Sie eine instance von TextBlockWritererstellen, übergeben Sie den aktuellen SynchronizationContext und ein StackPanel,wo ein TextBlock erstellt wird, der für die Ablaufverfolgungsausgabe verwendet werden soll:

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

Die Ablaufverfolgungsausgabe wird dann in einen neuen TextBlock geschrieben, der in dem von Ihnen übergebenen StackPanel erstellt wurde:

Screenshot: Beispiel für Windows Phone mit Ausgabe in der Anzeige

Protokollieren Windows Phone Clientereignissen in der Debugkonsole

Um die Ausgabe an die Debugkonsole und nicht an die Benutzeroberfläche zu senden, erstellen Sie eine Implementierung von TextWriter , die in das Debugfenster schreibt, und weisen Sie sie der TraceWriter-Eigenschaft Ihrer Verbindung zu:

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
}

Ablaufverfolgungsinformationen werden dann in das Debugfenster in Visual Studio geschrieben:

Screenshot: Dialogfeld

Aktivieren der Ablaufverfolgung im JavaScript-Client

Um die clientseitige Protokollierung für eine Verbindung zu aktivieren, legen Sie die logging -Eigenschaft für das Verbindungsobjekt fest, bevor Sie die start -Methode aufrufen, um die Verbindung herzustellen.

Client-JavaScript-Code zum Aktivieren der Ablaufverfolgung zur Browserkonsole (mit dem generierten Proxy)

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

JavaScript-Clientcode zum Aktivieren der Ablaufverfolgung in der Browserkonsole (ohne den generierten Proxy)

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

Wenn die Ablaufverfolgung aktiviert ist, protokolliert der JavaScript-Client Ereignisse in der Browserkonsole. Informationen zum Zugreifen auf die Browserkonsole finden Sie unter Überwachen von Transporten.

Der folgende Screenshot zeigt einen SignalR JavaScript-Client mit aktivierter Ablaufverfolgung. Es werden Verbindungs- und Hubaufrufereignisse in der Browserkonsole angezeigt:

SignalR-Ablaufverfolgungsereignisse in der Browserkonsole