Включение трассировки SignalR

от Tom фитзмаккен

Warning

Эта документация не относится к последней версии SignalR. Ознакомьтесь с ASP.NET Core SignalR.

В этом документе описано, как включить и настроить трассировку для серверов и клиентов SignalR. Трассировка позволяет просматривать диагностические сведения о событиях в приложении SignalR.

Этот раздел изначально был написан с помощью Патрик Флетчера.

Версии программного обеспечения, используемые в этом руководстве

Вопросы и комментарии

Оставьте отзыв о том, как вы понравится вам в этом учебнике, и что можно улучшить в комментариях в нижней части страницы. Если у вас есть вопросы, не связанные непосредственно с этим руководством, их можно опубликовать на форуме ASP.NET SignalR или StackOverflow.com.

Когда трассировка включена, приложение SignalR создает записи журнала для событий. События можно регистрировать как из клиента, так и с сервера. Трассировка на сервере регистрирует соединение, масштабируемый поставщик и события шины сообщений. Трассировка на клиенте регистрирует события соединения. В SignalR 2,1 и более поздних версиях трассировка на клиенте записывает в журнал полное содержимое сообщений о вызовах концентратора.

Содержимое

Включение трассировки на сервере

Трассировка включается на сервере в файле конфигурации приложения (файл App. config или Web. config в зависимости от типа проекта). Укажите категории событий, которые необходимо заносить в журнал. В файле конфигурации также указывается, следует ли записывать события в текстовый файл, в журнал событий Windows или в пользовательский журнал, используя реализацию прослушивателя TraceListener.

К категориям событий сервера относятся следующие виды сообщений:

Источник Сообщения
SignalR. Склмессажебус Установка поставщика масштабирования шины сообщений SQL, события базы данных, ошибки и время ожидания
SignalR.ServiceBusMessageBus Создание раздела поставщика масштабирования служебной шины и события подписки, ошибок и сообщений
SignalR. Редисмессажебус Redis, отключение и события ошибок для поставщика масштабирования.
SignalR. Скалеаутмессажебус Масштабирование событий обмена сообщениями
SignalR. транспорт. Вебсоккеттранспорт Транспортное соединение WebSocket, отключение, Обмен сообщениями и события ошибок
SignalR. транспорт. Серверсентевентстранспорт Серверсентевентс транспортное соединение, отключение, Обмен сообщениями и события ошибок
SignalR. транспорт. Фореверфраметранспорт Фореверфраме транспортное соединение, отключение, Обмен сообщениями и события ошибок
SignalR.Transports.LongPollingTransport Лонгполлинг транспортное соединение, отключение, Обмен сообщениями и события ошибок
SignalR.Transports.TransportHeartBeat Транспортные подключения, отключение и события KeepAlive
SignalR. Рефлектедхубдескрипторпровидер События обнаружения концентратора

Ведение журнала событий сервера в текстовые файлы

В следующем коде показано, как включить трассировку для каждой категории события. Этот пример настраивает приложение для записи событий в текстовые файлы.

Код 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

Note

При использовании журнала событий установите для параметра TraceLevel значение Error , чтобы поддерживать Управление числом сообщений.

Включение трассировки в клиенте .NET (классическое приложение для Windows)

Клиент .NET может регистрировать события в консоли, текстовом файле или пользовательском журнале с помощью реализации TextWriter.

Чтобы включить ведение журнала в клиенте .NET, задайте для свойства TraceLevel соединения значение трацелевелс , а свойству 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

Приложения SignalR для Windows Phoneных приложений используют один и тот же клиент .NET в качестве классических приложений, но консоль. out и запись в файл с помощью StreamWriter недоступны. Вместо этого необходимо создать пользовательскую реализацию TextWriter для трассировки.

Ведение журнала Windows Phone событий клиента в пользовательском интерфейсе

База кода SignalR содержит Windows Phone пример, который записывает выходные данные трассировки в TextBlock с помощью пользовательской реализации TextWriter , именуемой TextBlockWriter. Этот класс можно найти в проекте Samples/Microsoft. AspNet. SignalR. Client. WP8. Samples . При создании экземпляра TextBlockWriterпередайте текущий SynchronizationContextи StackPanel , где будет создан TextBlock , используемый для вывода трассировки:

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

Затем выходные данные трассировки будут записаны в новый TextBlock , созданный в переданном StackPanel .

Запись событий клиента Windows Phone в консоль отладки

Чтобы отправить выходные данные в консоль отладки, а не в пользовательский интерфейс, создайте реализацию 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 для включения трассировки в консоль браузера (с созданным прокси-сервером)

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

Клиентский код JavaScript для включения трассировки в консоль браузера (без созданного прокси-сервера)

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

Когда трассировка включена, клиент JavaScript регистрирует события в консоли браузера. Сведения о доступе к консоли браузера см. в разделе мониторинг транспортов.

На следующем снимке экрана показан клиент на JavaScript SignalR с включенной трассировкой. В консоли браузера отображаются события вызова подключения и концентратора:

События трассировки SignalR в консоли браузера