Azure Web Rolünde SignalR performans sayaçlarını kullanma
Tarafından Luke Latham
Uyarı
Bu belgeler SignalR'nin en son sürümüne yönelik değildir. ASP.NET Core SignalR'ye göz atın.
SignalR performans sayaçları, azure web rolünde uygulamanızın performansını izlemek için kullanılır. Sayaçlar Microsoft Azure Tanılama tarafından yakalanır. Azure'da SignalR performans sayaçlarını, tek başına veya şirket içi uygulamalar için kullanılan aynı araç olan signalr.exeile yüklersiniz. Azure rolleri geçici olduğundan, başlatma sırasında SignalR performans sayaçlarını yükleyip kaydedecek bir uygulama yapılandırabilirsiniz.
Önkoşullar
- Visual Studio 2015 veya 2017
- Visual Studio için Microsoft Azure SDKNot: SDK'yi yükledikten sonra makinenizi yeniden başlatın.
- Microsoft Azure aboneliği: Ücretsiz azure deneme hesabına kaydolmak için bkz. Azure Ücretsiz Deneme.
SignalR performans sayaçlarını kullanıma sunan bir Azure Web Rolü uygulaması oluşturma
Visual Studio'yu açın.
Visual Studio'da Dosya>Yeni Proje'yi> seçin.
Yeni Proje iletişim kutusunda, soldaki Visual C#>Cloud kategorisini ve ardından Azure Bulut Hizmeti şablonunu seçin. Uygulamaya SignalRPerfCounters adını verin ve Tamam'ı seçin.
Not
Bulut şablonu kategorisini veya Azure Bulut Hizmeti şablonunu görmüyorsanız Visual Studio 2017 için Azure geliştirme iş yükünü yüklemeniz gerekir. Visual Studio Yükleyicisi açmak için Yeni Proje iletişim kutusunun sol alt tarafındaki Visual Studio Yükleyicisi aç bağlantısını seçin. Azure geliştirme iş yükünü seçin ve ardından değiştir'i seçerek iş yükünü yüklemeye başlayın.
Yeni Microsoft Azure Bulut Hizmeti iletişim kutusunda ASP.NET Web Rolü'ne> tıklayın ve rolü projeye eklemek için düğmeyi seçin. Tamam’ı seçin.
Yeni ASP.NET Web Uygulaması - WebRole1 iletişim kutusunda MVC şablonunu ve ardından Tamam'ı seçin.
Çözüm Gezgini'daWebRole1 altında diagnostics.wadcfgx dosyasını açın.
Dosyanın içeriğini aşağıdaki yapılandırmayla değiştirin ve dosyayı kaydedin:
<?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>
Araçlar>NuGet Paket Yöneticisi'nden Paket YöneticisiKonsolu'nu açın. SignalR'nin en son sürümünü ve SignalR yardımcı programları paketini yüklemek için aşağıdaki komutları girin:
install-package microsoft.aspnet.signalr install-package microsoft.aspnet.signalr.utils
Başlatma veya geri dönüşüm sırasında rol örneğine SignalR performans sayaçlarını yüklemek için uygulamayı yapılandırın. Çözüm Gezgini'daWebRole1 projesine sağ tıklayın veYeni Klasör Ekle'yi> seçin. Yeni klasörü Başlangıç olarak adlandırın.
signalr.exe dosyasını (Microsoft.AspNet.SignalR.Utils paketiyle birlikte eklenir) proje klasöründen<>/SignalRPerfCounters/packages/Microsoft.AspNet.SignalR.Utils dosyasından kopyalayın.<önceki adımda oluşturduğunuz Başlangıç klasörüne sürüm>/araçlar.
Çözüm Gezgini'daBaşlangıç klasörüne sağ tıklayın veVarolan ÖğeYiEkle'yi> seçin. Görüntülenen iletişim kutusunda signalr.exe ve ekle'yi seçin.
Oluşturduğunuz Başlangıç klasörüne sağ tıklayın. Yeni Öğe Ekle'yi> seçin. Genel düğümünü seçin, Metin Dosyası'nı seçin ve yeni öğeyi SignalRPerfCounterInstall.cmd olarak adlandırın. Bu komut dosyası SignalR performans sayaçlarını web rolüne yükler.
Visual Studio SignalRPerfCounterInstall.cmd dosyasını oluşturduğunda, otomatik olarak ana pencerede açılır. Dosyanın içeriğini aşağıdaki betikle değiştirin, ardından dosyayı kaydedip kapatın. Bu betik signalr.exeyürütür ve bu da SignalR performans sayaçlarını rol örneğine ekler.
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
Çözüm Gezgini signalr.exedosyasını seçin. Dosyanın Özellikleri'nde, Çıkış Dizinine Kopyala'yıHer Zaman Kopyala olarak ayarlayın.
SignalRPerfCounterInstall.cmd dosyası için önceki adımı yineleyin.
SignalRPerfCounterInstall.cmd dosyasına sağ tıklayın ve Birlikte Aç'ı seçin. Görüntülenen iletişim kutusunda İkili Düzenleyici'yi ve ardından Tamam'ı seçin.
İkili düzenleyicide, dosyada önde gelen baytları seçin ve silin. Dosyayı kaydedin ve kapatın.
ServiceDefinition.csdef dosyasını açın ve hizmet başlatıldığında SignalrPerfCounterInstall.cmd dosyasını yürüten bir başlangıç görevi ekleyin:
<?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>
jQuery paket betiğini açın
Views/Shared/_Layout.cshtml
ve dosyanın sonundan kaldırın.<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>
Sunucuda yöntemini sürekli olarak çağıran
increment
bir JavaScript istemcisi ekleyin. İçeriği açınViews/Home/Index.cshtml
ve aşağıdaki kodla değiştirin:@{ 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>
WebRole1 projesinde Hubs adlı yeni bir klasör oluşturun. Çözüm Gezgini'daHubs klasörüne sağ tıklayın veYeni ÖğeEkle'yi> seçin. Yeni Öğe Ekle iletişim kutusunda Web>SignalR kategorisini ve ardından SignalR Hub Sınıfı (v2) öğe şablonunu seçin. Yeni hub'a MyHub.cs adını verin ve Ekle'yi seçin.
MyHub.cs otomatik olarak ana pencerede açılır. İçeriği aşağıdaki kodla değiştirin, ardından dosyayı kaydedip kapatın:
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 , SignalR kod tabanıyla sağlanan bir bağlantı yoğunluğu test aracıdır. Krank kalıcı bir bağlantı gerektirdiğinden, test sırasında kullanmak üzere sitenize bir bağlantı eklersiniz. WebRole1 projesine PersistentConnections adlı yeni bir klasör ekleyin. Bu klasöre sağ tıklayın veSınıfEkle'yi> seçin. Yeni sınıf dosyasını MyPersistentConnections.cs olarak adlandırın ve Ekle'yi seçin.
Visual Studio, ana pencerede MyPersistentConnections.cs dosyasını açar. İçeriği aşağıdaki kodla değiştirin, ardından dosyayı kaydedip kapatın:
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); } } }
sınıfını
Startup
kullanarak SignalR nesneleri OWIN başlatıldığında başlar. Startup.cs dosyasını açın veya oluşturun ve içeriğini aşağıdaki kodla değiştirin: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"); } } }
Yukarıdaki kodda özniteliği,
OwinStartup
OWIN'i başlatmak için bu sınıfı işaretler. yöntemi SignalR'yiConfiguration
başlatır.F5 tuşuna basarak uygulamanızı Microsoft Azure Öykünücüsü test edin.
Not
MapSignalR'dabir FileLoadException ile karşılaşırsanız, web.config'deki bağlama yeniden yönlendirmelerini aşağıdaki şekilde değiştirin:
<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>
Bir dakika kadar bekleyin. Visual Studio'da Bulut Gezgini araç penceresini açın (Bulut Gezgini'niGörüntüle>) ve yolunu
(Local)/Storage Accounts/(Development)/Tables
genişletin. WADPerformanceCountersTable'a çift tıklayın. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız Azure Depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Bulut Gezgini'nde tabloyu görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek için açık tablo penceresindeki Yenile düğmesini seçmeniz gerekebilir.Uygulamanızı bulutta test etmek için ServiceConfiguration.Cloud.cscfg dosyasını güncelleştirin ve öğesini geçerli bir Azure Depolama hesabı bağlantı dizesi olarak ayarlayın
Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString
.<?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>
Uygulamayı Azure aboneliğinize dağıtın. Bir uygulamayı Azure'a dağıtma hakkında ayrıntılı bilgi için bkz. Bulut Hizmeti Oluşturma ve Dağıtma.
Birkaç dakika bekleyin. Bulut Gezgini'nde yukarıda yapılandırdığınız depolama hesabını bulun ve içindeki tabloyu bulun
WADPerformanceCountersTable
. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız Azure Depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Bulut Gezgini'nde tabloyu görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek için açık tablo penceresindeki Yenile düğmesini seçmeniz gerekebilir.
Bu öğreticide kullanılan orijinal içerik için Martin Richard'a özel teşekkürler.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin