Activation du traçage SignalR

par Tom FitzMacken

Avertissement

Cette documentation ne concerne pas la dernière version de SignalR. Consultez ASP.NET Core SignalR.

Ce document explique comment activer et configurer le suivi pour les serveurs et clients SignalR. Le suivi vous permet d’afficher des informations de diagnostic sur les événements dans votre application SignalR.

Ce sujet a été écrit à l’origine par Patrick Fletcher.

Versions logicielles utilisées dans le tutoriel

Questions et commentaires

Laissez vos commentaires sur la façon dont vous avez aimé ce tutoriel et sur ce que nous pourrions améliorer dans les commentaires en bas de la page. Si vous avez des questions qui ne sont pas directement liées au tutoriel, vous pouvez les publier sur le forum ASP.NET SignalR ou StackOverflow.com.

Lorsque le suivi est activé, une application SignalR crée des entrées de journal pour les événements. Vous pouvez journaliser les événements à partir du client et du serveur. Suivi sur les événements de connexion des journaux de serveur, de fournisseur de scaleout et de bus de messages. Le suivi sur le client journalise les événements de connexion. Dans SignalR 2.1 et versions ultérieures, le suivi sur le client consigne le contenu complet des messages d’appel du hub.

Contenu

Activation du suivi sur le serveur

Vous activez le suivi sur le serveur dans le fichier de configuration de l’application (App.config ou Web.config selon le type de projet).) Vous spécifiez les catégories d’événements que vous souhaitez journaliser. Dans le fichier de configuration, vous spécifiez également s’il faut consigner les événements dans un fichier texte, le journal des événements Windows ou un journal personnalisé à l’aide d’une implémentation de TraceListener.

Les catégories d’événements de serveur incluent les types de messages suivants :

Source Messages
SignalR.SqlMessageBus Configuration du fournisseur de scale-out SQL Message Bus, opérations de base de données, erreurs et événements de délai d’expiration
SignalR.ServiceBusMessageBus Événements de création et d’abonnement, d’erreur et de messagerie du fournisseur service bus scaleout
SignalR.RedisMessageBus Événements de connexion, de déconnexion et d’erreur du fournisseur redis scaleout
SignalR.ScaleoutMessageBus Événements de messagerie Scaleout
SignalR.Transports.WebSocketTransport Événements de connexion, de déconnexion, de messagerie et d’erreur de transport WebSocket
SignalR.Transports.ServerSentEventsTransport Événements de connexion, de déconnexion, de messagerie et d’erreur de transport ServerSentEvents
SignalR.Transports.ForeverFrameTransport Événements de connexion, de déconnexion, de messagerie et d’erreur de transport ForeverFrame
SignalR.Transports.LongPollingTransport Événements de connexion, de déconnexion, de messagerie et d’erreur de transport LongPolling
SignalR.Transports.TransportHeartBeat Événements de connexion, de déconnexion et de maintien du transport
SignalR.ReflectedHubDescriptorProvider Événements de découverte hub

Journalisation des événements de serveur dans des fichiers texte

Le code suivant montre comment activer le suivi pour chaque catégorie d’événement. Cet exemple configure l’application pour qu’elle journalise les événements dans des fichiers texte.

Code du serveur XML pour activer le suivi

<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>

Dans le code ci-dessus, l’entrée SignalRSwitch spécifie le TraceLevel utilisé pour les événements envoyés au journal spécifié. Dans ce cas, il est défini sur Verbose , ce qui signifie que tous les messages de débogage et de suivi sont enregistrés.

La sortie suivante affiche les entrées du transports.log.txt fichier pour une application à l’aide du fichier de configuration ci-dessus. Il montre une nouvelle connexion, une connexion supprimée et des événements de pulsation de transport.

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)

Journalisation des événements du serveur dans le journal des événements

Pour consigner les événements dans le journal des événements plutôt que dans un fichier texte, modifiez les valeurs des entrées dans le sharedListeners nœud. Le code suivant montre comment journaliser les événements de serveur dans le journal des événements :

Code du serveur XML pour la journalisation des événements dans le journal des événements

<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>

Les événements sont enregistrés dans le journal des applications et sont disponibles via le observateur d'événements, comme indiqué ci-dessous :

observateur d'événements affichant les journaux SignalR

Notes

Lorsque vous utilisez le journal des événements, définissez traceLevel sur Erreur pour que le nombre de messages reste gérable.

Activation du suivi dans le client .NET (applications de bureau Windows)

Le client .NET peut consigner des événements dans la console, un fichier texte ou dans un journal personnalisé à l’aide d’une implémentation de TextWriter.

Pour activer la journalisation dans le client .NET, définissez la propriété de TraceLevel la connexion sur une valeur TraceLevels et la TraceWriter propriété sur un instance TextWriter valide.

Journalisation des événements du client Desktop dans la console

Le code C# suivant montre comment journaliser les événements du client .NET dans la console :

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();

Journalisation des événements du client Desktop dans un fichier texte

Le code C# suivant montre comment journaliser les événements du client .NET dans un fichier texte :

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();

La sortie suivante affiche les entrées du ClientLog.txt fichier pour une application à l’aide du fichier de configuration ci-dessus. Il montre le client qui se connecte au serveur et le hub appelant une méthode cliente appelée 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!"]}]})

Activation du traçage dans les clients Windows Phone 8

Les applications SignalR pour les applications Windows Phone utilisent le même client .NET que les applications de bureau, mais Console.Out et l’écriture dans un fichier avec StreamWriter ne sont pas disponibles. Au lieu de cela, vous devez créer une implémentation personnalisée de TextWriter pour le suivi.

Journalisation Windows Phone événements clients dans l’interface utilisateur

Le codebase SignalR inclut un exemple de Windows Phone qui écrit la sortie de trace dans un TextBlock à l’aide d’une implémentation TextWriter personnalisée appelée TextBlockWriter. Cette classe se trouve dans le projet samples/Microsoft.AspNet.SignalR.Client.WP8.Samples . Lors de la création d’un instance de TextBlockWriter, passez le SynchronizationContext actuel et un StackPanel où il créera un TextBlock à utiliser pour la sortie de trace :

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

La sortie de trace sera ensuite écrite dans un nouveau TextBlock créé dans le StackPanel que vous avez transmis :

Capture d’écran montrant un exemple de Windows Phone avec une sortie dans l’affichage.

Journalisation Windows Phone événements clients dans la console de débogage

Pour envoyer la sortie à la console de débogage plutôt qu’à l’interface utilisateur, créez une implémentation de TextWriter qui écrit dans la fenêtre de débogage et affectez-la à la propriété TraceWriter de votre connexion :

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
}

Les informations de trace seront ensuite écrites dans la fenêtre de débogage dans Visual Studio :

Capture d’écran montrant la boîte de dialogue Sortie. Déboguer se trouve dans le champ Afficher la sortie à partir de .

Activation du traçage dans le client JavaScript

Pour activer la journalisation côté client sur une connexion, définissez la logging propriété sur l’objet de connexion avant d’appeler la start méthode pour établir la connexion.

Code JavaScript client pour activer le suivi vers la console du navigateur (avec le proxy généré)

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

Code JavaScript client pour activer le suivi vers la console du navigateur (sans le proxy généré)

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

Lorsque le suivi est activé, le client JavaScript journalise les événements dans la console du navigateur. Pour accéder à la console du navigateur, consultez Surveillance des transports.

La capture d’écran suivante montre un client JavaScript SignalR avec le suivi activé. Il affiche les événements d’appel de connexion et de hub dans la console du navigateur :

Événements de suivi SignalR dans la console du navigateur