Verwenden von SignalR-Leistungsindikatoren in einer Azure-Webrolle
Von Luke Latham
Warnung
Diese Dokumentation ist nicht für die neueste Version von SignalR vorgesehen. Sehen Sie sich ASP.NET Core SignalR an.
SignalR-Leistungsindikatoren werden verwendet, um die Leistung Ihrer App in einer Azure-Webrolle zu überwachen. Die Indikatoren werden von Microsoft Azure-Diagnose erfasst. Sie installieren SignalR-Leistungsindikatoren in Azure mit signalr.exe, demselben Tool, das auch für eigenständige oder lokale Apps verwendet wird. Da Azure-Rollen vorübergehend sind, konfigurieren Sie eine App, um SignalR-Leistungsindikatoren beim Start zu installieren und zu registrieren.
Voraussetzungen
- Visual Studio 2015 oder 2017
- Microsoft Azure SDK für Visual StudioHinweis: Starten Sie Ihren Computer nach der Installation des SDK neu.
- Microsoft Azure-Abonnement: Informationen zur Registrierung für ein kostenloses Azure-Testkonto finden Sie unter Kostenlose Azure-Testversion.
Erstellen einer Azure-Webrollenanwendung, die SignalR-Leistungsindikatoren verfügbar macht
Öffnen Sie Visual Studio.
Klicken Sie in Visual Studio auf Datei>Neu>Projekt.
Wählen Sie im Dialogfeld Neues Projekt links die Kategorie Visual C#>Cloud und dann die Vorlage Azure Cloud Service aus. Nennen Sie die App SignalRPerfCounters, und wählen Sie OK aus.
Hinweis
Wenn die Kategorie "Cloudvorlage " oder die Vorlage "Azure Cloud Service " nicht angezeigt wird, müssen Sie die Azure-Entwicklungsworkload für Visual Studio 2017 installieren. Wählen Sie unten links im Dialogfeld Neues Projekt den Link Visual Studio-Installer öffnen aus, um Visual Studio-Installer zu öffnen. Wählen Sie die Workload Azure-Entwicklung und dann Ändern aus, um mit der Installation der Workload zu beginnen.
Wählen Sie im Dialogfeld Neuer Microsoft Azure-Clouddienstdie Option ASP.NET Webrolle aus, und wählen Sie die > Schaltfläche aus, um die Rolle dem Projekt hinzuzufügen. Klicken Sie auf OK.
Wählen Sie im Dialogfeld Neue ASP.NET Webanwendung – WebRole1 die MVC-Vorlage und dann OK aus.
Öffnen Sie in Projektmappen-Explorer die Datei Diagnose.wadcfgx unter WebRole1.
Ersetzen Sie den Inhalt der Datei durch die folgende Konfiguration, und speichern Sie die Datei:
<?xml version="1.0" encoding="utf-8"?> <DiagnosticsConfiguration xmlns="http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration"> <PublicConfig> <WadCfg> <DiagnosticMonitorConfiguration overallQuotaInMB="4096"> <DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter="Error" /> <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Error" /> <Directories scheduledTransferPeriod="PT1M"> <IISLogs containerName ="wad-iis-logfiles" /> <FailedRequestLogs containerName ="wad-failedrequestlogs" /> </Directories> <WindowsEventLog scheduledTransferPeriod="PT1M"> <DataSource name="Application!*[System[(Level=1 or Level=2 or Level=3)]]" /> <DataSource name="Windows Azure!*[System[(Level=1 or Level=2 or Level=3 or Level=4)]]" /> </WindowsEventLog> <CrashDumps containerName="wad-crashdumps" dumpType="Mini"> <CrashDumpConfiguration processName="WaIISHost.exe" /> <CrashDumpConfiguration processName="WaWorkerHost.exe" /> <CrashDumpConfiguration processName="w3wp.exe" /> </CrashDumps> <PerformanceCounters scheduledTransferPeriod="PT1M"> <PerformanceCounterConfiguration counterSpecifier="\Memory\Available MBytes" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\ISAPI Extension Requests/sec" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\Web Service(_Total)\Bytes Total/Sec" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Requests/Sec" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\ASP.NET Applications(__Total__)\Errors Total/Sec" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Queued" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\ASP.NET\Requests Rejected" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\Processor(_Total)\% Processor Time" sampleRate="PT3M" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\% Time in GC" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Exceptions(w3wp)\# of Exceps Thrown / sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\# of current logical Threads" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\# of current physical Threads" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\Current Queue Length" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR LocksAndThreads(w3wp)\Contention Rate / sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# Bytes in all Heaps" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# GC Handles" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\.NET CLR Memory(w3wp)\# of Pinned Objects" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Connected" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Reconnected" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Disconnected" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connections Current" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Received Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Sent Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Received/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Connection Messages Sent/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Received Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Received/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Message Bus Messages Received/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Published Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Messages Published/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers Current" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Subscribers/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Allocated Workers" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Busy Workers" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Message Bus Topics Current" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: All Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: All/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Resolution Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Resolution/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Invocation Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Hub Invocation/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Tranport Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Errors: Transport/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Open" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Streams Buffering" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Errors Total" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Errors/Sec" sampleRate="PT10S" /> <PerformanceCounterConfiguration counterSpecifier="\SignalR(*)\Scaleout Send Queue Length" sampleRate="PT10S" /> </PerformanceCounters> </DiagnosticMonitorConfiguration> </WadCfg> <StorageAccount></StorageAccount> </PublicConfig> <PrivateConfig> <StorageAccount name="" key="" endpoint="" /> </PrivateConfig> <IsEnabled>true</IsEnabled> </DiagnosticsConfiguration>
Öffnen Sie die Paket-Manager-Konsole unter Tools>NuGet-Paket-Manager. Geben Sie die folgenden Befehle ein, um die neueste Version von SignalR und das SignalR-Hilfsprogrammpaket zu installieren:
install-package microsoft.aspnet.signalr install-package microsoft.aspnet.signalr.utils
Konfigurieren Sie die App so, dass die SignalR-Leistungsindikatoren in der Rolle instance installiert werden, wenn sie gestartet oder wiederverwendet wird. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das Projekt WebRole1, und wählen SieNeuen Ordnerhinzufügen> aus. Nennen Sie den neuen Ordner Startup.
Kopieren Sie die signalr.exe-Datei (hinzugefügt mit dem Paket Microsoft.AspNet.SignalR.Utils ) aus dem <Projektordner>/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils.<Version>/Tools für den Ordner "Start" , den Sie im vorherigen Schritt erstellt haben.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Start, und wählen SieVorhandenes Elementhinzufügen> aus. Wählen Sie im angezeigten Dialogfeld signalr.exe und dann Hinzufügen aus.
Klicken Sie mit der rechten Maustaste auf den ordner Startup , den Sie erstellt haben. Klicken Sie dann auf Hinzufügen>Neues Element. Wählen Sie den Knoten Allgemein , wählen Sie Textdatei aus, und nennen Sie das neue Element SignalRPerfCounterInstall.cmd. Mit dieser Befehlsdatei werden die SignalR-Leistungsindikatoren in der Webrolle installiert.
Wenn Visual Studio die Datei SignalRPerfCounterInstall.cmd erstellt, wird sie automatisch im fenster Standard geöffnet. Ersetzen Sie den Inhalt der Datei durch das folgende Skript, und speichern und schließen Sie die Datei. Dieses Skript führt signalr.exeaus, wodurch der Rolle instance die SignalR-Leistungsindikatoren hinzugefügt werden.
SET SignalR_LogDir=%~dp0Log\ MKDIR "%SignalR_LogDir%" cd %~dp0 signalr.exe ipc >> "%SignalR_LogDir%SignalR_Log.txt" 2>&1 net localgroup "Performance Monitor Users" "Network Service" /ADD >> "%SignalR_LogDir%NetworkAdd.txt" 2>&1
Wählen Sie die signalr.exe-Datei in Projektmappen-Explorer aus. Legen Sie in den Eigenschaften der Datei In Ausgabeverzeichnis kopieren auf Immer kopieren fest.
Wiederholen Sie den vorherigen Schritt für die Datei SignalRPerfCounterInstall.cmd .
Klicken Sie mit der rechten Maustaste auf die Datei SignalRPerfCounterInstall.cmd , und wählen Sie Öffnen mit aus. Wählen Sie im angezeigten Dialogfeld Binär-Editor und dann OK aus.
Wählen Sie im binären Editor alle führenden Bytes in der Datei aus, und löschen Sie sie. Speichern und schließen Sie die Datei.
Öffnen Sie ServiceDefinition.csdef , und fügen Sie eine Startaufgabe hinzu, die die Datei SignalrPerfCounterInstall.cmd ausführt, wenn der Dienst gestartet wird:
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="SignalRPerfCounters" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6"> <WebRole name="WebRole1" vmsize="Small"> <Startup> <Task commandLine="Startup\SignalRPerfCounterInstall.cmd" executionContext="elevated" taskType="background" /> </Startup> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> </WebRole> </ServiceDefinition>
Öffnen Sie
Views/Shared/_Layout.cshtml
das jQuery-Paketskript, und entfernen Sie es am Ende der Datei.<div class="container body-content"> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year - My ASP.NET Application</p> </footer> </div> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html>
Fügen Sie einen JavaScript-Client hinzu, der die
increment
-Methode kontinuierlich auf dem Server aufruft. Öffnen SieViews/Home/Index.cshtml
, und ersetzen Sie den Inhalt durch den folgenden Code:@{ ViewBag.Title = "Home Page"; } <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script> <script src="~/signalr/hubs" type="text/javascript"></script> <div id="body"> <section class="featured"> <div class="content-wrapper"> <p> Hello World! </p> <div style="font-size:large;"> My Counter: <span id="counter"></span> </div> </div> </section> <section class="content-wrapper main-content clear-fix"></section> </div> <script type="text/javascript"> $(document).ready(function () { var hub = $.connection.myHub; hub.client.sendResult = function (x) { console.log('sendResult(' + x + ')'); $("#counter").text(x); window.setTimeout(function () { hub.server.increment(x); }, 1000); }; $.connection.hub.connected = function () {}; $.connection.hub.disconnected = function () {}; $.connection.hub.stateChanged(function (change) { console.log('new State' + change.newState); if (change.newState === $.signalR.connectionState.disconnected) { $.connection.hub.start(); } if (change.newState === $.signalR.connectionState.reconnecting) { console.log('Re-connecting'); } else if (change.newState === $.signalR.connectionState.connected) { console.log('The server is online'); } }); $.connection.hub.error(function (error) { console.log('error ' + error); }); $.connection.hub.logging = true; $.connection.hub.reconnected(function () { console.log('Reconnected'); hub.server.increment(0); }); $.connection.hub.start().done(function () { console.log('hub started'); hub.server.increment(0); }); }); </script>
Erstellen Sie im WebRole1-Projekt einen neuen Ordner mit dem Namen Hubs. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Hubs, und wählen SieNeues Elementhinzufügen> aus. Wählen Sie im Dialogfeld Neues Element hinzufügen die Kategorie Web>SignalR und dann die Elementvorlage SignalR Hub Class (v2) aus. Nennen Sie den neuen Hub MyHub.cs , und wählen Sie Hinzufügen aus.
MyHub.cs wird automatisch im fenster Standard geöffnet. Ersetzen Sie den Inhalt durch den folgenden Code, und speichern und schließen Sie die Datei:
using System.Threading.Tasks; using Microsoft.AspNet.SignalR; namespace WebRole1.Hubs { public class MyHub : Hub { public async Task Increment(int x) { await this.Clients.Caller.sendResult(x + 1); } } }
Crank.exe ist ein Tool zum Testen der Verbindungsdichte, das mit der SignalR-Codebasis bereitgestellt wird. Da Crank eine permanente Verbindung erfordert, fügen Sie Ihrer Website eine hinzu, um sie beim Testen zu verwenden. Fügen Sie dem WebRole1-Projekt einen neuen Ordner namens PersistentConnections hinzu. Klicken Sie mit der rechten Maustaste auf diesen Ordner, und wählen Sie Klasse hinzufügen> aus. Nennen Sie die neue Klassendatei MyPersistentConnections.cs , und wählen Sie Hinzufügen aus.
Visual Studio öffnet die Datei MyPersistentConnections.cs im fenster Standard. Ersetzen Sie den Inhalt durch den folgenden Code, und speichern und schließen Sie die Datei:
using System.Threading.Tasks; using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR.Infrastructure; namespace WebRole1.PersistentConnections { public class MyPersistentConnection : PersistentConnection { protected override Task OnReceived(IRequest request, string connectionId, string data) { //Return data to calling user return Connection.Send(connectionId, data); } } }
Mithilfe der
Startup
-Klasse beginnen die SignalR-Objekte, wenn OWIN gestartet wird. Öffnen oder erstellen Sie Startup.cs , und ersetzen Sie den Inhalt durch den folgenden Code:using Microsoft.Owin; using Owin; using WebRole1.PersistentConnections; // Marks this class for automatic OWIN startup [assembly: OwinStartup(typeof(WebRole1.Startup))] namespace WebRole1 { public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); // Only needed if "No Authentication" was not selected for the project app.MapSignalR(); app.MapSignalR<MyPersistentConnection>("/echo"); } } }
Im obigen Code markiert das
OwinStartup
Attribut diese Klasse, um OWIN zu starten. DieConfiguration
-Methode startet SignalR.Testen Sie Ihre Anwendung im Microsoft Azure-Emulator, indem Sie F5 drücken.
Hinweis
Wenn bei MapSignalR eine FileLoadException auftritt, ändern Sie die Bindungsumleitungen in web.config wie folgt:
<dependentAssembly> <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.2.0" newVersion="2.0.0.0" /> </dependentAssembly>
Warten Sie etwa eine Minute. Öffnen Sie das Fenster des Cloud Explorer-Tools in Visual Studio (CloudExploreranzeigen>), und erweitern Sie den Pfad .
(Local)/Storage Accounts/(Development)/Tables
Doppelklicken Sie auf WADPerformanceCountersTable. SignalR-Indikatoren sollten in den Tabellendaten angezeigt werden. Wenn die Tabelle nicht angezeigt wird, müssen Sie möglicherweise Ihre Azure Storage-Anmeldeinformationen erneut eingeben. Möglicherweise müssen Sie die Schaltfläche Aktualisieren auswählen, um die Tabelle in Cloud Explorer anzuzeigen, oder die Schaltfläche Aktualisieren im geöffneten Tabellenfenster auswählen, um Daten in der Tabelle anzuzeigen.Aktualisieren Sie zum Testen Ihrer Anwendung in der Cloud die Datei ServiceConfiguration.Cloud.cscfg , und legen Sie auf eine gültige Verbindungszeichenfolge für das
Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString
Azure Storage-Konto fest.<?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="SignalRPerfCounters" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2015-04.2.6"> <Role name="WebRole1"> <Instances count="1" /> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=<account-name>;AccountKey=<account-key>" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
Stellen Sie die Anwendung in Ihrem Azure-Abonnement bereit. Ausführliche Informationen zum Bereitstellen einer Anwendung in Azure finden Sie unter Erstellen und Bereitstellen eines Clouddiensts.
Warten Sie ein paar Minuten. Suchen Sie in Cloud Explorer nach dem speicherkonto, das Sie oben konfiguriert haben, und suchen Sie die
WADPerformanceCountersTable
Tabelle darin. SignalR-Indikatoren sollten in den Tabellendaten angezeigt werden. Wenn die Tabelle nicht angezeigt wird, müssen Sie möglicherweise Ihre Azure Storage-Anmeldeinformationen erneut eingeben. Möglicherweise müssen Sie die Schaltfläche Aktualisieren auswählen, um die Tabelle in Cloud Explorer anzuzeigen, oder die Schaltfläche Aktualisieren im geöffneten Tabellenfenster auswählen, um Daten in der Tabelle anzuzeigen.
Ein besonderer Dank gilt Martin Richard für die originalen Inhalte, die in diesem Tutorial verwendet werden.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für