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
- Visual Studio 2013
- .NET Framework 4.5
- SignalR w wersji 2
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:
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 TextBlockWriter
elementu 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:
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:
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: