Azure Web rolünde SignalR performans sayaçlarını kullanma

Luke Latham tarafından

Warning

Bu belge, SignalR 'nin en son sürümü için değildir. ASP.NET Core SignalR'ye göz atın.

SignalR performans sayaçları, uygulamanızın performansını bir Azure Web rolünde 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ı aracı signalr.exeile birlikte yüklersiniz. Azure rolleri geçici olduğundan, bir uygulamayı başlangıçtan sonra SignalR performans sayaçlarını yükleyecek ve kaydedecek şekilde yapılandırırsınız.

Ön koşullar

SignalR performans sayaçlarını kullanıma sunan bir Azure Web rolü uygulaması oluşturma

  1. Visual Studio'yu açın.

  2. Visual Studio 'da Dosya > Yeni > Proje' yi seçin.

  3. Yeni proje iletişim kutusunda, sol taraftaki Visual C# > bulut kategorisini seçin ve ardından Azure bulut hizmeti şablonunu seçin. Uygulamayı Signalrperfcounters olarak adlandırın ve Tamam' ı seçin.

    Yeni bulut uygulaması

    Note

    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 sonra iş yükünü yüklemeye başlamak için Değiştir ' i seçin.

    Visual Studio Yükleyicisi Azure geliştirme iş yükü

  4. Yeni Microsoft Azure bulut hizmeti iletişim kutusunda ASP.NET Web rolü ' nü seçin ve rolü projeye eklemek için > düğmesini seçin. Tamam’ı seçin.

    ASP.NET Web rolü Ekle

  5. Yeni ASP.NET Web uygulaması-WebRole1 Iletişim kutusunda MVC şablonunu seçin ve ardından Tamam' ı seçin.

    MVC ve Web API 'SI ekleme

  6. Çözüm Gezgini' de, WebRole1altında Diagnostics. wadcfgx dosyasını açın.

    Çözüm Gezgini Diagnostics. wadcfgx

  7. 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>
    
  8. AraçlarNuGet Paket Yöneticisi ' nden Paket Yöneticisi konsolunu açın > NuGet Package Manager. 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
    
  9. Uygulamayı başlatıldığında veya geri dönüştürüldüğünde, SignalR performans sayaçlarını rol örneğine yükleyecek şekilde yapılandırın. Çözüm Gezgini, WebRole1 projesine sağ tıklayın ve Add > Yeni klasörEkle ' yi seçin. Yeni klasör başlangıcınıadlandırın.

    Başlangıç klasörü Ekle

  10. signalr.exe dosyasını ( Microsoft. Aspnet. SignalR. utils paketiyle eklenen) <project folder> /SignalRPerfCounters/Packages/Microsoft.Aspnet.SignalR.utils. <version> adresinden kopyalayın /Tools önceki adımda oluşturduğunuz Başlangıç klasörüne gidin.

  11. Çözüm Gezgini, Başlangıç klasörüne sağ tıklayın ve Add > Varolan öğeEkle ' yi seçin. Görüntülenen iletişim kutusunda signalr.exe ' ı seçin ve Ekle' yi seçin.

    Projeye signalr.exe Ekle

  12. Oluşturduğunuz Başlangıç klasörüne sağ tıklayın. Add > Yeni öğeEkle ' yi seçin. Genel düğümünü seçin, metin dosyası' nı seçin ve yeni öğe signalrperfcounterınstall. cmdolarak adlandırın. Bu komut dosyası, SignalR performans sayaçlarını Web rolüne yükler.

    SignalR performans sayacı yüklemesi toplu iş dosyası oluşturma

  13. Visual Studio, Signalrperfcounterınstall. cmd dosyasını oluşturduğunda ana pencerede otomatik olarak açılır. Dosyanın içeriğini aşağıdaki komut dosyasıyla değiştirin, sonra dosyayı kaydedip kapatın. Bu betik, SignalR performans sayaçlarını rol örneğine ekleyen signalr.exeyürütülür.

    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
    
  14. Çözüm Gezgini signalr.exe dosyasını seçin. Dosyanın özelliklerinde, her zaman kopyalamakiçin Çıkış Dizinine Kopyala ' yı ayarlayın.

    Her zaman kopyalamak için çıkış dizinine Kopyala ayarla

  15. Signalrperfcounterınstall. cmd dosyası için önceki adımı tekrarlayın.

  16. Signalrperfcounterınstall. cmd dosyasına sağ tıklayın ve birlikte Aç' ı seçin. Görüntülenen iletişim kutusunda Ikili düzenleyici ' yi seçin ve Tamam' ı seçin.

    Ikili düzenleyiciyle aç

  17. İkili düzenleyicide, dosyadaki önde gelen baytları seçin ve silin. Dosyayı kaydedin ve kapatın.

    Baştaki baytları Sil

  18. ServiceDefinition. csdef ' i açın ve hizmet başlatıldığında Signalrperfcounterınstall. 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>
    
  19. Views/Shared/_Layout.cshtmlDosya sonundan jQuery paket betiğini açın ve kaldırın.

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>
    
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    </body>
    </html>
    
  20. Sunucuda yöntemi sürekli çağıran bir JavaScript istemcisi ekleyin increment . Views/Home/Index.cshtmlİçeriğini açın ve şu 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>
    
  21. WebRole1 projesinde hub 'laradlı yeni bir klasör oluşturun. Çözüm Gezgini hub klasörüne sağ tıklayın ve Add > Yeni öğeEkle ' yi seçin. Yeni öğe Ekle iletişim kutusunda, Web > SignalR kategorisini seçin ve ardından SignalR hub sınıfı (v2) öğe şablonunu seçin. Yeni hub MyHub.cs ' ı adlandırın ve Ekle' yi seçin.

    SignalR hub sınıfı yeni öğe Ekle iletişim kutusunda hub klasörüne ekleniyor

  22. MyHub.cs , ana pencerede otomatik olarak açılır. İçeriği aşağıdaki kodla değiştirin, sonra 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);
            }
        }
    }
    
  23. Crank.exe , SignalR kod temeli ile birlikte sunulan bir bağlantı yoğunluğu test aracıdır. Crank kalıcı bir bağlantı gerektirdiğinden, test ederken kullanmak için sitenize bir tane ekleyin. WebRole1 projesine Persistentconnectionsadlı yeni bir klasör ekleyin. Bu klasöre sağ tıklayın ve sınıf Ekle' yi seçin > Class. Yeni sınıf dosyasını MyPersistentConnections.cs olarak adlandırın ve Ekle' yi seçin.

  24. Visual Studio, MyPersistentConnections.cs dosyasını ana pencerede açar. İçeriği aşağıdaki kodla değiştirin, sonra 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);        
            }
        }
    }
    
  25. Sınıfını kullanarak Startup , OWıN başlatıldığında SignalR nesneleri başlatılır. Startup.cs açın veya oluşturun ve içeriğini şu 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 OwinStartup özniteliği, OWıN 'u başlatmak için bu sınıfı işaretler. ConfigurationYöntemi SignalR 'yi başlatır.

  26. F5tuşuna basarak Microsoft Azure öykünücüsü uygulamanızı test edin.

    Note

    Mapsignalr'de bir fileloadexception ile karşılaşırsanız web.config 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>
    
  27. Bir dakika bekleyin. Visual Studio 'da Cloud Explorer araç penceresini açın (View > bulut Gezgininigörüntüleyin) ve yolu genişletin (Local)/Storage Accounts/(Development)/Tables . WADPerformanceCountersTableç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. Tabloyu Cloud Explorer 'da görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek Için tablo aç penceresindeki Yenile düğmesini seçmeniz gerekebilir.

    Visual Studio Cloud Explorer 'da WAD performans sayaçları tablosunu seçme

    WAD performans sayaçları tablosunda toplanan sayaçları gösterme

  28. Uygulamanızı bulutta test etmek için, ServiceConfiguration. Cloud. cscfg dosyasını güncelleştirin ve öğesini Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString geçerli bir Azure depolama hesabı bağlantı dizesi olarak ayarlayın.

    <?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=&lt;account-name&gt;;AccountKey=&lt;account-key&gt;" />
        </ConfigurationSettings>
      </Role>
    </ServiceConfiguration>
    
  29. 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.

  30. Birkaç dakika bekleyin. Cloud Explorer'da, yukarıda yapılandırdığınız depolama hesabını bulun ve WADPerformanceCountersTable içindeki tabloyu bulun. Tablo verilerinde SignalR sayaçlarını görmeniz gerekir. Tabloyu görmüyorsanız, Azure depolama kimlik bilgilerinizi yeniden girmeniz gerekebilir. Tabloyu Cloud Explorer 'da görmek için Yenile düğmesini seçmeniz veya tablodaki verileri görmek Için tablo aç penceresindeki Yenile düğmesini seçmeniz gerekebilir.

Bu öğreticide kullanılan özgün içerik için özel Marrichard 'e teşekkür ederiz.