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 Leistungsindikatoren werden von Microsoft Azure-Diagnose erfasst. Sie installieren SignalR-Leistungsindikatoren in Azure mit signalr.exe, demselben Tool, das für eigenständige oder lokale Apps verwendet wird. Da Azure-Rollen vorübergehend sind, konfigurieren Sie eine App zum Installieren und Registrieren von SignalR-Leistungsindikatoren beim Start.
Voraussetzungen
- Visual Studio 2015 oder 2017
- Microsoft Azure SDK für Visual Studio Hinweis: Starten Sie Ihren Computer nach der Installation des SDK neu.
- Microsoft Azure-Abonnement: Informationen zum Registrieren für ein kostenloses Azure-Testkonto finden Sie unter "Kostenlose Azure-Testversion".
Erstellen einer Azure Web Role-Anwendung, 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" die Kategorie "Visual C#>Cloud" auf der linken Seite und dann die Azure Cloud Service-Vorlage aus. Benennen Sie die App SignalRPerfCounters, und wählen Sie "OK" aus.
Hinweis
Wenn die Kategorie der Cloudvorlage oder die Azure Cloud Service-Vorlage nicht angezeigt wird, müssen Sie die Azure-Entwicklungsarbeitslast für Visual Studio 2017 installieren. Wählen Sie den Link "Visual Studio-Installer öffnen" unten links im Dialogfeld "Neues Projekt" aus, um Visual Studio-Installer zu öffnen. Wählen Sie die Azure-Entwicklungsarbeitsauslastung aus, und wählen Sie dann "Ändern" aus, um mit der Installation der Workload zu beginnen.
Wählen Sie im Dialogfeld "Neuer Microsoft Azure Cloud Service" ASP.NET Webrolle aus, und wählen Sie die > Schaltfläche aus, um dem Projekt die Rolle hinzuzufügen. Wählen Sie OK aus.
Wählen Sie im Dialogfeld "Neue ASP.NET Webanwendung - WebRole1" die MVC-Vorlage und dann "OK" aus.
Öffnen Sie in Projektmappen-Explorer die Datei diagnostics.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 über "Tools>NuGet Paket-Manager". Geben Sie die folgenden Befehle ein, um die neueste Version von SignalR und das SignalR-Dienstprogrammpaket zu installieren:
install-package microsoft.aspnet.signalr install-package microsoft.aspnet.signalr.utils
Konfigurieren Sie die App, um die SignalR-Leistungsindikatoren beim Starten oder Recyceln in der Rolleninstanz zu installieren. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf das WebRole1-Projekt, und wählen Sie "Neuen Ordner hinzufügen>" aus. Benennen Sie den neuen Ordner "Startup".
Kopieren Sie die signalr.exe Datei (hinzugefügt mit dem Microsoft.AspNet.SignalR.Utils-Paket) aus <dem Projektordner>/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils.<version>/tools to the Startup folder you created in the previous step.
Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf den Startordner, und wählen Sie "Vorhandenes Element hinzufügen">aus. Wählen Sie im daraufhin angezeigten Dialogfeld signalr.exe und dann "Hinzufügen" aus.
Klicken Sie mit der rechten Maustaste auf den von Ihnen erstellten Startordner . Klicken Sie dann auf Hinzufügen>Neues Element. Wählen Sie den Knoten "Allgemein " aus, wählen Sie "Textdatei" aus, und benennen Sie das neue Element SignalRPerfCounterInstall.cmd. Diese Befehlsdatei installiert die SignalR-Leistungsindikatoren in der Webrolle.
Wenn Visual Studio die SignalRPerfCounterInstall.cmd Datei erstellt, wird sie automatisch im Hauptfenster geöffnet. Ersetzen Sie den Inhalt der Datei durch das folgende Skript, speichern und schließen Sie die Datei. Dieses Skript führt signalr.exe aus, wodurch der Rolleninstanz 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 "Auf Ausgabeverzeichnis kopieren" "Immer kopieren" fest.
Wiederholen Sie den vorherigen Schritt für die SignalRPerfCounterInstall.cmd Datei.
Klicken Sie mit der rechten Maustaste auf die SignalRPerfCounterInstall.cmd Datei, und wählen Sie " Öffnen mit" aus. Wählen Sie im daraufhin angezeigten Dialogfeld "Binär-Editor" und dann "OK" aus.
Wählen Sie im Binär-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 SignalrPerfCounterInstall.cmd Datei 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 und entfernen Sie
Views/Shared/_Layout.cshtml
das jQuery-Bündelskript 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. ÖffnenViews/Home/Index.cshtml
Sie den Inhalt, 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 einen neuen Ordner im WebRole1-Projekt mit dem Namen "Hubs". Klicken Sie mit der rechten Maustaste in Projektmappen-Explorer auf den Ordner "Hubs", und wählen Sie "Neues Element hinzufügen">aus. Wählen Sie im Dialogfeld "Neues Element hinzufügen" die Kategorie "WebsignalR>" und dann die Elementvorlage "SignalR Hub Class (v2)" aus. Benennen Sie den neuen Hub MyHub.cs, und wählen Sie "Hinzufügen" aus.
MyHub.cs wird automatisch im Hauptfenster 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 Verbindungsdichtetesttool, das mit der SignalR-Codebasis bereitgestellt wird. Da Crank eine dauerhafte Verbindung erfordert, fügen Sie ihrer Website einen hinzu, um sie beim Testen zu verwenden. Fügen Sie dem WebRole1-Projekt einen neuen Ordner mit dem Namen PersistentConnections hinzu. Klicken Sie mit der rechten Maustaste auf diesen Ordner, und wählen Sie "Klasse hinzufügen">aus. Benennen Sie die neue Klassendatei MyPersistentConnections.cs, und wählen Sie "Hinzufügen" aus.
Visual Studio öffnet die MyPersistentConnections.cs-Datei im Hauptfenster. 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); } } }
Mit 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" in Folgendes:
<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 ungefähr eine Minute. Öffnen Sie das Toolfenster "Cloud Explorer" in Visual Studio (Cloud Explorer anzeigen>), und erweitern Sie den Pfad.
(Local)/Storage Accounts/(Development)/Tables
Doppelklicken Sie auf WADPerformanceCountersTable. SignalR-Zähler sollten in den Tabellendaten angezeigt werden. Wenn die Tabelle nicht angezeigt wird, müssen Sie Ihre Azure Storage-Anmeldeinformationen möglicherweise erneut eingeben. Möglicherweise müssen Sie die Schaltfläche "Aktualisieren" auswählen, um die Tabelle im Cloud Explorer anzuzeigen, oder die Schaltfläche "Aktualisieren" im geöffneten Tabellenfenster auswählen, um Daten in der Tabelle anzuzeigen.Um Ihre Anwendung in der Cloud zu testen, aktualisieren Sie die Datei ServiceConfiguration.Cloud.cscfg, und legen Sie den
Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString
Wert auf ein gültiges Azure Storage-Konto Verbindungszeichenfolge 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 How to Create and Deploy a Cloud Service.
Warten Sie ein paar Minuten. Suchen Sie im Cloud Explorer das oben konfigurierte Speicherkonto, und suchen Sie die
WADPerformanceCountersTable
Tabelle darin. SignalR-Zähler sollten in den Tabellendaten angezeigt werden. Wenn die Tabelle nicht angezeigt wird, müssen Sie Ihre Azure Storage-Anmeldeinformationen möglicherweise erneut eingeben. Möglicherweise müssen Sie die Schaltfläche "Aktualisieren" auswählen, um die Tabelle im Cloud Explorer anzuzeigen, oder die Schaltfläche "Aktualisieren" im geöffneten Tabellenfenster auswählen, um Daten in der Tabelle anzuzeigen.
Besonderer Dank an Martin Richard für den ursprünglichen Inhalt, der in diesem Lernprogramm verwendet wird.