Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
Эта документация не подходит для последней версии SignalR. Взгляните на ASP.NET Core SignalR.
В этом документе описывается включение и настройка трассировки для серверов и клиентов SignalR. Трассировка позволяет просматривать диагностические сведения о событиях в приложении SignalR.
Эта тема была первоначально написана Патриком Флетчером.
Версии программного обеспечения, используемые в руководстве
- Visual Studio 2013
- .NET Framework 4.5
- SignalR версии 2
Вопросы и комментарии
Оставьте отзыв о том, как вам понравилось это руководство и что, по вашему мнению, мы можем улучшить в комментариях в нижней части страницы. Если у вас есть вопросы, которые не связаны напрямую с руководством, их можно опубликовать на форуме ASP.NET SignalR или StackOverflow.com.
Если трассировка включена, приложение SignalR создает записи журнала для событий. События можно записывать как от клиента, так и от сервера. Трассировка на сервере регистрирует подключения, поставщика масштабирования соединений и события шины сообщений. Прослеживание событий соединения в журналах клиента. В SignalR 2.1 и более поздних версиях трассировка на стороне клиента логирует полное содержимое сообщений вызова хаба.
Содержимое
Включение трассировки на сервере
Вы включите трассировку на сервере в файле конфигурации приложения (App.config или Web.config в зависимости от типа проекта.) Укажите категории событий, которые требуется регистрировать. В файле конфигурации также указывается, следует ли регистрировать события в текстовый файл, журнал событий Windows или пользовательский журнал с помощью реализации TraceListener.
Категории событий сервера включают следующие виды сообщений:
| Исходный материал | Messages |
|---|---|
| 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, используемую для событий, отправленных в указанный журнал. В этом случае установлено значение 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.
Ведение журнала событий клиента Desktop в консоли
В следующем коде 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();
Ведение журнала событий клиента Desktop в текстовый файл
В следующем коде 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, что и настольные приложения, но Console.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 с включенной трассировкой. В консоли браузера отображаются события вызова подключения и концентратора: