啟用 SignalR 追蹤

作者:Tom FitzMacken

警告

本檔不適用於最新版的 SignalR。 看看ASP.NET Core SignalR

本檔說明如何啟用及設定 SignalR 伺服器和用戶端的追蹤。 追蹤可讓您檢視 SignalR 應用程式中事件的相關診斷資訊。

本主題最初是由 Patrick Fletcher 所撰寫。

教學課程中使用的軟體版本

問題和批註

請留下您喜歡本教學課程的意見反應,以及我們可以在頁面底部的批註中改善的內容。 如果您有與教學課程不直接相關的問題,您可以將問題張貼至 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>

事件會記錄在應用程式記錄檔中,而且可透過事件檢視器取得,如下所示:

顯示 SignalR 記錄的事件檢視器

注意

使用事件記錄檔時,將 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範例的螢幕擷取畫面。

將用戶端事件記錄至偵錯主控台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 用戶端。 它會在瀏覽器主控台中顯示連線和中樞呼叫事件:

瀏覽器主控台中的 SignalR 追蹤事件