Freigeben über


Erstellen von Profilen und Debuggen der ASP.NET MVC-App mit Glimpse

von Rick Anderson

Glimpse ist eine wachsende Familie von Open Source NuGet-Paketen, die detaillierte Leistungs-, Debug- und Diagnoseinformationen für ASP.NET-Apps bereitstellt. Es ist trivial, einfach, ultraschnell zu installieren und wichtige Leistungsmetriken unten auf jeder Seite anzuzeigen. Es ermöglicht Ihnen, einen Drilldown in Ihre App durchzuführen, wenn Sie herausfinden müssen, was auf dem Server vor sich geht. Glimpse bietet so viele wertvolle Informationen, die Sie während Ihres gesamten Entwicklungszyklus verwenden sollten, einschließlich Ihrer Azure-Testumgebung. Während Fiddler und die F-12-Entwicklungstools eine clientseitige Ansicht bieten, bietet Glimpse eine detaillierte Ansicht vom Server. Dieses Tutorial konzentriert sich auf die Verwendung der Pakete "Glimpse ASP.NET MVC" und "EF", aber es sind viele andere Pakete verfügbar. Wenn möglich, verlinke ich auf die entsprechenden Glimpse-Dokumente , die ich bei der Pflege behilflich bin. Glimpse ist ein Open Source Projekt, auch Sie können zum Quellcode und zur Dokumentation beitragen.

Installieren von Glimpse

Sie können Glimpse über die NuGet-Paket-Manager-Konsole oder über die Konsole "NuGet-Pakete verwalten" installieren. Für diese Demo installiere ich die Pakete Mvc5 und EF6:

Installieren von Glimpse von NuGet Dlg

Suchen nach "Glimpse.EF"

Glimpse.EF von NuGet installieren dlg

Wenn Sie Installierte Pakete auswählen, können Sie die installierten abhängigen Module für Einblicke anzeigen:

Installierte Glimpse-Pakete von DLg

Mit den folgenden Befehlen werden die Module "Glimpse MVC5" und "EF6" über die Paket-Manager-Konsole installiert:

PM> Install-Package Glimpse.MVC5
PM> Install-Package Glimpse.EF6

Aktivieren von Einblicke für localhost

Navigieren Sie zu http://localhost:<port #>/glimpse.axd, und klicken Sie auf die Schaltfläche Blick aktivieren .

Seite

Wenn Ihre Favoritenleiste angezeigt wird, können Sie die Schaltflächen "Blick" ziehen und ablegen und sie als Lesezeichen hinzufügen:

IE mit Blick-Lesezeichen

Sie können jetzt in Ihrer App navigieren, und die Heads-Up-Anzeige (HUD ) wird unten auf der Seite angezeigt.

Kontakt-Manager-Seite mit HUD

Auf der Seite "Blick-HUD" werden die oben gezeigten Zeitsteuerungsinformationen ausführlich beschrieben. Die unauffälligen Leistungsdaten, die das HUD anzeigt, können Sie sofort über ein Problem informieren – bevor Sie zum Testzyklus gelangen. Wenn Sie auf das "g" in der unteren rechten Ecke klicken, wird der Bereich Blick angezeigt:

Blickbereich

In der obigen Abbildung ist die Registerkarte Ausführung ausgewählt, auf der Zeitsteuerungsdetails der Aktionen und Filter in der Pipeline angezeigt werden. Sie können sehen, dass der Timer für den Filter "Überwachung beenden" in Phase 6 der Pipeline beginnt. Während mein Timer mit geringem Gewicht nützliche Profil-/Zeitdaten bereitstellen kann, fehlt die gesamte Zeit, die für die Autorisierung und das Rendern der Ansicht aufgewendet wird. Informationen zu meinem Timer finden Sie unter Profil und Zeit Ihrer ASP.NET MVC-App bis zu Azure.

Registerkarte „Zeitachse“

Ich habe Tom Dykstras herausragendes EF 6/MVC 5-Tutorial mit der folgenden Codeänderung an den Instructors-Controller geändert:

public ActionResult Index(int? id, int? courseID, int ? eager)
{
    var viewModel = new InstructorIndexData();

    viewModel.Instructors = db.Instructors
        .Include(i => i.OfficeAssignment)
        .Include(i => i.Courses.Select(c => c.Department))
        .OrderBy(i => i.LastName);

    if (id != null)
    {
        ViewBag.InstructorID = id.Value;
        viewModel.Courses = viewModel.Instructors.Where(
            i => i.ID == id.Value).Single().Courses;
    }

    if (courseID != null)
    {
       ViewBag.CourseID = courseID.Value;
       // Eager loading
       if (eager != null && eager > 0)
       {
          ViewBag.eagerMsg = "Eager Loading";

          viewModel.Enrollments = viewModel.Courses.Where(
              x => x.CourseID == courseID).Single().Enrollments;

       }
       else { 
        // Explicit loading
          ViewBag.eagerMsg = "Explicit Loading";

        var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();
        db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();
        foreach (Enrollment enrollment in selectedCourse.Enrollments)
        {
            db.Entry(enrollment).Reference(x => x.Student).Load();
        }

        viewModel.Enrollments = selectedCourse.Enrollments;
       }
    }

    return View(viewModel);
}

Mit dem obigen Code kann ich die Abfragezeichenfolge (eager) übergeben, um das eifrige oder explizite Laden von Daten zu steuern. In der folgenden Abbildung wird explizites Laden verwendet, und auf der Seite "Timing" wird jede in der Index Aktionsmethode geladene Registrierung angezeigt:

Explizites Laden

Im folgenden Code wird eager angegeben, und jede Registrierung wird abgerufen, nachdem die Index Ansicht aufgerufen wurde:

eager ist angegeben.

Sie können auf ein Zeitsegment zeigen, um detaillierte Zeitinformationen zu erhalten:

Zeigen Sie mit dem Mauszeiger, um eine detaillierte Zeitsteuerung anzuzeigen.

Modellbindung

Die Registerkarte Modellbindung bietet eine Fülle von Informationen, die Ihnen helfen zu verstehen, wie Ihre Formularvariablen gebunden sind und warum einige nicht wie erwartet gebunden sind. Die folgende Abbildung zeigt das Symbol ? , auf das Sie klicken können, um die Hilfeseite für dieses Feature anzuzeigen.

Ansicht

Routen

Die Registerkarte Einblickerouten kann Ihnen beim Debuggen und Verstehen des Routings helfen. In der folgenden Abbildung ist die Produktroute ausgewählt (und sie zeigt grün, eine Blickkonvention). Ausgewählter Produktname Routeneinschränkungen, Bereiche und Datentoken werden ebenfalls angezeigt. Weitere Informationen finden Sie unter Einblicke in Routen und Attributrouting in ASP.NET MVC 5 .

Verwenden von "Glimpse" in Azure

Die Standardmäßige Sicherheitsrichtlinie "Glimpse" lässt nur zu, dass Daten vom lokalen Host angezeigt werden. Sie können diese Sicherheitsrichtlinie ändern, damit Sie diese Daten auf einem Remoteserver (z. B. einer Web-App in Azure) anzeigen können. Fügen Sie für Testumgebungen in Azure die hervorgehobene Markierung am Ende der web.config-Datei hinzu, um Einblicke zu aktivieren:

<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd">
    <runtimePolicies>
      <ignoredTypes>
        <add type="Glimpse.AspNet.Policy.LocalPolicy, Glimpse.AspNet"/>
      </ignoredTypes>
    </runtimePolicies>
  </glimpse>
</configuration>

Mit dieser Änderung allein kann jeder Benutzer Ihre Glimpse-Daten auf einem Remotestandort sehen. Erwägen Sie, das obige Markup einem Veröffentlichungsprofil hinzuzufügen, damit es nur angewendet wird, wenn Sie dieses Veröffentlichungsprofil verwenden (z. B. Ihr Azure-Testprofil). Zum Einschränken von Glimpse-Daten fügen wir die Rolle hinzu und erlauben nur Benutzern in dieser Rolle das Anzeigen von Einblickdaten.To restrict Glimpse data, we will add the canViewGlimpseData role and only users in this role to view data.

Entfernen Sie die Kommentare aus der Datei "GlimpseSecurityPolicy.cs ", und ändern Sie den IsInRole-Aufruf von in Administrator die canViewGlimpseData Rolle:

public class GlimpseSecurityPolicy : IRuntimePolicy
{
    public RuntimePolicy Execute(IRuntimePolicyContext policyContext)
    {
        var httpContext = policyContext.GetHttpContext();
        if (!httpContext.User.IsInRole("canViewGlimpseData"))
        {
            return RuntimePolicy.Off;
        }

        return RuntimePolicy.On;
    }

    public RuntimeEvent ExecuteOn
    {
        get { return RuntimeEvent.EndRequest | RuntimeEvent.ExecuteResource; }
    }
}

Warnung

Sicherheit: Die von Glimpse bereitgestellten umfangreichen Daten können die Sicherheit Ihrer App verfügbar machen. Microsoft hat keine Sicherheitsüberwachung von Glimpse für die Verwendung in Produktions-Apps durchgeführt.

Informationen zum Hinzufügen von Rollen finden Sie im Tutorial Bereitstellen einer Sicheren ASP.NET MVC 5-Web-App mit Mitgliedschaft, OAuth und SQL-Datenbank in Azure.

Zusätzliche Ressourcen