啟用 SignalR 追蹤
警告
本檔不適用於最新版的 SignalR。 看看ASP.NET Core SignalR。
本檔說明如何啟用及設定 SignalR 伺服器和用戶端的追蹤。 追蹤可讓您檢視 SignalR 應用程式中事件的相關診斷資訊。
本主題最初是由 Patrick Fletcher 所撰寫。
教學課程中使用的軟體版本
- Visual Studio 2013
- .NET Framework 4.5
- SignalR 第 2 版
問題和批註
請留下您喜歡本教學課程的意見反應,以及我們可以在頁面底部的批註中改善的內容。 如果您有與教學課程不直接相關的問題,您可以將問題張貼至 ASP.NET SignalR 論壇 或 StackOverflow.com。
啟用追蹤時,SignalR 應用程式會建立事件的記錄專案。 您可以從用戶端和伺服器記錄事件。 伺服器記錄連線、向外延展提供者和訊息匯流排事件的追蹤。 用戶端上的追蹤會記錄線上活動。 在 SignalR 2.1 和更新版本中,用戶端上的追蹤會記錄中樞調用訊息的完整內容。
目錄
在伺服器上啟用追蹤
您可以根據 project 的類型,在應用程式的組態檔內啟用追蹤, (App.config或Web.config。) 您可以指定您想要記錄的事件類別。 在組態檔中,您也會指定是否使用 TraceListener的實作,將事件記錄檔記錄到文字檔、Windows 事件記錄檔或自訂記錄檔。
伺服器事件類別目錄包含下列訊息:
來源 | 訊息 |
---|---|
SignalR.SqlMessageBus | SQL 訊息匯流排相應放大提供者設定、資料庫作業、錯誤和逾時事件 |
SignalR.ServiceBusMessageBus | 服務匯流排相應放大提供者主題建立和訂用帳戶、錯誤和傳訊事件 |
SignalR.RedisMessageBus | Redis 向外延展提供者連線、中斷連線和錯誤事件 |
SignalR.ScaleoutMessageBus | 向外延展傳訊事件 |
SignalR.Transports.WebSocketTransport | WebSocket 傳輸連線、中斷連線、傳訊和錯誤事件 |
SignalR.Transports.ServerSentEventsTransport | ServerSentEvents 傳輸連線、中斷連線、傳訊和錯誤事件 |
SignalR.Transports.ForeverFrameTransport | ForeverFrame 傳輸連線、中斷連線、傳訊和錯誤事件 |
SignalR.Transports.LongPollingTransport | LongPolling 傳輸連線、中斷連線、傳訊和錯誤事件 |
SignalR.Transports.TransportHeartBeat | 傳輸連線、中斷連線和保留事件 |
SignalR.ReflectedHubDescriptorProvider | 中樞探索事件 |
將伺服器事件記錄到文字檔
下列程式碼示範如何啟用每個事件類別的追蹤。 此範例會將應用程式設定為將事件記錄到文字檔。
用於啟用追蹤的 XML 伺服器程式碼
<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>
在上述程式碼中,專案 SignalRSwitch
會指定用於傳送至指定記錄檔之事件的 TraceLevel 。 在此情況下,它會設定為 Verbose
,這表示會記錄所有偵錯和追蹤訊息。
下列輸出顯示使用 transports.log.txt
上述組態檔的應用程式檔案中的專案。 它會顯示新的連線、移除的連線,以及傳輸活動訊號事件。
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)
將伺服器事件記錄到事件記錄檔
若要將事件記錄到事件記錄檔,而不是文字檔,請變更節點中 sharedListeners
專案的值。 下列程式碼示範如何將伺服器事件記錄至事件記錄檔:
將事件記錄至事件記錄檔的 XML 伺服器程式碼
<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>
事件會記錄在應用程式記錄檔中,而且可透過事件檢視器取得,如下所示:
注意
使用事件記錄檔時,將 TraceLevel 設定為 Error ,讓訊息數目保持可管理。
在 .NET 用戶端中啟用追蹤 (Windows 傳統型應用程式)
.NET 用戶端可以使用 TextWriter的實作,將事件記錄到主控台、文字檔或自訂記錄。
若要在 .NET 用戶端中啟用記錄,請將連線的 TraceLevel
屬性設定為 TraceLevels 值,並將 TraceWriter
屬性設定為有效的 TextWriter 實例。
將桌面用戶端事件記錄到主控台
下列 C# 程式碼示範如何將 .NET 用戶端中的事件記錄至主控台:
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();
將桌面用戶端事件記錄到文字檔
下列 C# 程式碼示範如何將 .NET 用戶端中的事件記錄至文字檔:
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();
下列輸出顯示使用 ClientLog.txt
上述組態檔的應用程式檔案中的專案。 它會顯示連線到伺服器的用戶端,以及叫用名為 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!"]}]})
在 Windows Phone 8 個用戶端中啟用追蹤
Windows Phone應用程式的 SignalR 應用程式會使用與傳統型應用程式相同的 .NET 用戶端,但無法使用Console.Out和寫入StreamWriter檔案。 相反地,您需要建立 TextWriter 的自訂實作以進行追蹤。
將用戶端事件記錄至 UI Windows Phone
SignalR 程式碼基底包含Windows Phone範例,此範例會使用稱為 TextBlockWriter
的自訂TextWriter實作,將追蹤輸出寫入TextBlock。 您可以在 samples/Microsoft.AspNet.SignalR.Client.WP8.Samples 專案中找到這個類別。 建立 的 TextBlockWriter
實例時,傳入目前的SynchronizationCoNtext,以及將在其中建立TextBlock以用於追蹤輸出的StackPanel:
Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;
接著,追蹤輸出會寫入至您在傳入的StackPanel中建立的新TextBlock:
將用戶端事件記錄至偵錯主控台Windows Phone
若要將輸出傳送至偵錯主控台,而不是 UI,請建立寫入偵錯視窗的 TextWriter 實作,並將它指派給連線的 TraceWriter 屬性:
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
}
追蹤資訊接著會寫入 Visual Studio 中的偵錯視窗:
在 JavaScript 用戶端中啟用追蹤
若要在連線上啟用用戶端記錄,請先在連線物件上設定 logging
屬性,再呼叫 start
方法來建立連接。
用戶端 JavaScript 程式碼,可透過產生的 Proxy) 啟用瀏覽器主控台的追蹤 (
$.connection.hub.logging = true;
$.connection.hub.start();
用戶端 JavaScript 程式碼,可啟用瀏覽器主控台的追蹤 (,而不需產生 Proxy)
var connection = $.hubConnection();
connection.logging = true;
connection.start();
啟用追蹤時,JavaScript 用戶端會將事件記錄到瀏覽器主控台。 若要存取瀏覽器主控台,請參閱 監視傳輸。
下列螢幕擷取畫面顯示已啟用追蹤的 SignalR JavaScript 用戶端。 它會在瀏覽器主控台中顯示連線和中樞呼叫事件: