Udostępnij za pośrednictwem


Włączanie śledzenia usługi SignalR

– autor Tom FitzMacken

Ostrzeżenie

Ta dokumentacja nie dotyczy najnowszej wersji usługi SignalR. Przyjrzyj się ASP.NET Core SignalR.

W tym dokumencie opisano sposób włączania i konfigurowania śledzenia dla serwerów i klientów usługi SignalR. Śledzenie umożliwia wyświetlanie informacji diagnostycznych o zdarzeniach w aplikacji SignalR.

Ten temat został pierwotnie napisany przez PatrickA Fletchera.

Wersje oprogramowania używane w samouczku

Pytania i komentarze

Przekaż opinię na temat tego, jak ci się podobał ten samouczek i co możemy ulepszyć w komentarzach w dolnej części strony. Jeśli masz pytania, które nie są bezpośrednio związane z tym samouczkiem, możesz opublikować je na forum ASP.NET SignalR lub StackOverflow.com.

Po włączeniu śledzenia aplikacja SignalR tworzy wpisy dziennika dla zdarzeń. Zdarzenia można rejestrować zarówno z klienta, jak i serwera. Śledzenie na serwerze rejestruje połączenie, dostawcę skalowania w poziomie i zdarzenia magistrali komunikatów. Śledzenie na kliencie rejestruje zdarzenia połączenia. W usłudze SignalR 2.1 lub nowszym śledzenie na kliencie rejestruje pełną zawartość komunikatów wywołania centrum.

Zawartość

Włączanie śledzenia na serwerze

Śledzenie można włączyć na serwerze w pliku konfiguracji aplikacji (App.config lub Web.config w zależności od typu projektu). Należy określić kategorie zdarzeń, które chcesz rejestrować. W pliku konfiguracji można również określić, czy mają być rejestrowane zdarzenia w pliku tekstowym, w dzienniku zdarzeń systemu Windows, czy w dzienniku niestandardowym przy użyciu implementacji elementu TraceListener.

Kategorie zdarzeń serwera obejmują następujące rodzaje komunikatów:

Element źródłowy Komunikaty
SignalR.SqlMessageBus Konfiguracja dostawcy skalowania usługi SQL Message Bus, operacja bazy danych, błędy i zdarzenia przekroczenia limitu czasu
SignalR.ServiceBusMessageBus Tworzenie tematu dostawcy skalowania w usłudze Service Bus oraz tworzenie i subskrypcja, błędy i zdarzenia obsługi komunikatów
SignalR.RedisMessageBus Połączenie dostawcy skalowania usługi Redis, rozłączenie i zdarzenia błędów
SignalR.ScaleoutMessageBus Zdarzenia skalowania komunikatów w poziomie
SignalR.Transports.WebSocketTransport Połączenie transportu protokołu WebSocket, rozłączenie, obsługa komunikatów i zdarzenia błędów
SignalR.Transports.ServerSentEventsTransport ServerSentEvents połączenia transportowego, rozłączenia, obsługi komunikatów i zdarzeń błędów
SignalR.Transports.ForeverFrameTransport Połączenie transportu ForeverFrame, rozłączenie, obsługa komunikatów i zdarzenia błędów
SignalR.Transports.LongPollingTransport LongPolling połączenia transportowego, rozłączenia, obsługi komunikatów i zdarzeń błędów
SignalR.Transports.TransportHeartBeat Połączenie transportowe, rozłączenie i wydarzenia na żywo
SignalR.ReflectedHubDescriptorProvider Zdarzenia odnajdywania koncentratora

Rejestrowanie zdarzeń serwera w plikach tekstowych

Poniższy kod pokazuje, jak włączyć śledzenie dla każdej kategorii zdarzeń. Ten przykład umożliwia skonfigurowanie aplikacji do rejestrowania zdarzeń w plikach tekstowych.

Kod serwera XML do włączania śledzenia

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

W powyższym SignalRSwitch kodzie wpis określa wartość TraceLevel używaną dla zdarzeń wysyłanych do określonego dziennika. W tym przypadku jest ustawiona wartość Verbose , co oznacza, że rejestrowane są wszystkie komunikaty debugowania i śledzenia.

Poniższe dane wyjściowe pokazują wpisy z transports.log.txt pliku dla aplikacji przy użyciu powyższego pliku konfiguracji. Pokazuje nowe połączenie, usunięte połączenie i transport zdarzeń pulsu.

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)

Rejestrowanie zdarzeń serwera w dzienniku zdarzeń

Aby rejestrować zdarzenia w dzienniku zdarzeń zamiast pliku tekstowego, zmień wartości wpisów w węźle sharedListeners . Poniższy kod pokazuje, jak rejestrować zdarzenia serwera w dzienniku zdarzeń:

Kod serwera XML na potrzeby rejestrowania zdarzeń w dzienniku zdarzeń

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

Zdarzenia są rejestrowane w dzienniku aplikacji i są dostępne za pośrednictwem Podgląd zdarzeń, jak pokazano poniżej:

Podgląd zdarzeń pokazujące dzienniki usługi SignalR

Uwaga

W przypadku korzystania z dziennika zdarzeń ustaw wartość TraceLevel na Błąd , aby zachować liczbę komunikatów, którymi można zarządzać.

Włączanie śledzenia w kliencie .NET (aplikacje klasyczne systemu Windows)

Klient platformy .NET może rejestrować zdarzenia w konsoli, pliku tekstowego lub w dzienniku niestandardowym przy użyciu implementacji funkcji TextWriter.

Aby włączyć rejestrowanie w kliencie platformy .NET, ustaw właściwość połączenia TraceLevel na wartość TraceLevels , a TraceWriter właściwość na prawidłowe wystąpienie TextWriter .

Rejestrowanie zdarzeń klienta pulpitu w konsoli

Poniższy kod w języku C# pokazuje, jak rejestrować zdarzenia w kliencie platformy .NET w konsoli programu :

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

Rejestrowanie zdarzeń klienta pulpitu w pliku tekstowym

Poniższy kod w języku C# pokazuje, jak rejestrować zdarzenia w kliencie platformy .NET w pliku tekstowym:

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

Poniższe dane wyjściowe pokazują wpisy z ClientLog.txt pliku dla aplikacji przy użyciu powyższego pliku konfiguracji. Przedstawia on klienta nawiązującego połączenie z serwerem, a centrum wywołujące metodę klienta o nazwie 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!"]}]})

Włączanie śledzenia w klientach Windows Phone 8

Aplikacje SignalR dla aplikacji Windows Phone używają tego samego klienta platformy .NET co aplikacje klasyczne, ale aplikacja Console.Out i zapisywanie w pliku za pomocą narzędzia StreamWriter nie są dostępne. Zamiast tego należy utworzyć niestandardową implementację funkcji TextWriter do śledzenia.

Rejestrowanie Windows Phone zdarzeń klienta w interfejsie użytkownika

Baza kodu SignalR zawiera przykład Windows Phone, który zapisuje dane wyjściowe śledzenia w obiekcie TextBlock przy użyciu niestandardowej implementacji TextWriter o nazwie TextBlockWriter. Tę klasę można znaleźć w projekcie samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Podczas tworzenia wystąpienia TextBlockWriterelementu przekaż bieżący element SynchronizationContext i stackPanel , w którym zostanie utworzony element TextBlock do użycia na potrzeby danych wyjściowych śledzenia:

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

Dane wyjściowe śledzenia zostaną następnie zapisane w nowym elemecie TextBlock utworzonym w elemecie StackPanel , w którym przekazano:

Zrzut ekranu przedstawiający przykład Windows Phone z danymi wyjściowymi na ekranie.

Rejestrowanie zdarzeń klienta Windows Phone w konsoli debugowania

Aby wysyłać dane wyjściowe do konsoli debugowania, a nie do interfejsu użytkownika, utwórz implementację narzędzia TextWriter , która zapisuje w oknie debugowania i przypisz ją do właściwości TraceWriter połączenia:

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
}

Informacje śledzenia zostaną następnie zapisane w oknie debugowania w programie Visual Studio:

Zrzut ekranu przedstawiający okno dialogowe Dane wyjściowe. Debugowanie znajduje się w polu Pokaż dane wyjściowe.

Włączanie śledzenia w kliencie JavaScript

Aby włączyć rejestrowanie po stronie klienta w połączeniu, ustaw logging właściwość obiektu połączenia przed wywołaniem start metody w celu nawiązania połączenia.

Kod JavaScript klienta do włączania śledzenia w konsoli przeglądarki (z wygenerowany serwer proxy)

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

Kod JavaScript klienta do włączania śledzenia w konsoli przeglądarki (bez wygenerowanego serwera proxy)

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

Po włączeniu śledzenia klient javaScript rejestruje zdarzenia w konsoli przeglądarki. Aby uzyskać dostęp do konsoli przeglądarki, zobacz Monitorowanie transportu.

Poniższy zrzut ekranu przedstawia klienta języka JavaScript usługi SignalR z włączonym śledzeniem. W konsoli przeglądarki są wyświetlane zdarzenia wywołania połączenia i centrum:

Zdarzenia śledzenia usługi SignalR w konsoli przeglądarki