Eseguire la profilatura e il debug dell'app ASP.NET MVC con Glimpse

di Rick Anderson

L'assaggio è una famiglia di pacchetti NuGet open source che offre informazioni dettagliate sulle prestazioni, il debug e la diagnostica per le app ASP.NET. È semplice installare, leggero, ultra veloce e visualizzare le metriche delle prestazioni chiave nella parte inferiore di ogni pagina. Consente di eseguire il drill-down nell'app quando è necessario scoprire cosa accade nel server. Lo sguardo fornisce così tante informazioni preziose che è consigliabile usarlo durante il ciclo di sviluppo, incluso l'ambiente di test di Azure. Anche se Fiddler e gli strumenti di sviluppo F-12 offrono una visualizzazione lato client, Glimpse offre una visualizzazione dettagliata dal server. Questa esercitazione è incentrata sull'uso dei pacchetti Glimpse ASP.NET MVC ed EF, ma sono disponibili molti altri pacchetti. Laddove possibile, mi collego alla documentazione di Glimpse appropriata che mi aiuta a mantenere. Lo sguardo è un progetto open source, è possibile contribuire anche al codice sorgente e alla documentazione.

Installazione di Un'anteprima

È possibile installare Glimpse dalla console di gestione pacchetti NuGet o dalla console Gestisci pacchetti NuGet . Per questa demo, installerò i pacchetti Mvc5 ed EF6:

installare Glimpse da NuGet Dlg

Cercare Glimpse.EF

Glimpse.EF da NuGet install dlg

Selezionando Pacchetti installati, è possibile visualizzare i moduli dipendenti di Glimpse installati:

Pacchetti Di assaggio installati da DLg

I comandi seguenti installano i moduli Glimpse MVC5 ed EF6 dalla console di Gestione pacchetti:

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

Abilitare Lo sguardo per localhost

Passare alla http://localhost:<porta #>/glimpse.axd e fare clic sul pulsante Attiva visualizzazione .

Visualizzazione pagina axd

Se è visualizzata la barra preferita, è possibile trascinare e rilasciare i pulsanti Disastoglio e aggiungerli come segnalibri:

Internet Explorer con segnalibri di Glimpse

È ora possibile esplorare l'app e l'HUD ( Heads Up Display ) viene visualizzato nella parte inferiore della pagina.

Pagina Gestione contatti con HUD

La pagina HuD di assaggio descrive in dettaglio le informazioni sulla tempistica mostrate in precedenza. I dati sulle prestazioni non invasivi visualizzati dall'HUD possono notificare immediatamente un problema, prima di passare al ciclo di test. Facendo clic su "g" nell'angolo inferiore destro viene visualizzato il pannello Di visualizzazione:

Pannello Di assaggio

Nell'immagine precedente viene selezionata la scheda Esecuzione, che mostra i dettagli di intervallo delle azioni e dei filtri nella pipeline. È possibile visualizzare il timer del filtro Arresta espressione di controllo a partire dalla fase 6 della pipeline. Anche se il timer di peso leggero può fornire dati di profilo/temporizzazione utili, manca tutto il tempo impiegato per l'autorizzazione e il rendering della visualizzazione. Per informazioni sul timer, vedere Profilo e Ora dell'app ASP.NET MVC fino ad Azure.

Scheda Sequenza temporale

Ho modificato l'eccezionale esercitazione di EF 6/MVC 5 di Tom Dykstra con la modifica del codice seguente al controller degli istruttori:

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);
}

Il codice precedente consente di passare la stringa di query (eager) per controllare il caricamento eager o esplicito dei dati. Nell'immagine seguente viene usato il caricamento esplicito e la pagina di temporizzazione mostra ogni registrazione caricata nel Index metodo di azione:

caricamento esplicito

Nel codice seguente viene specificato eager e ogni registrazione viene recuperata dopo la chiamata alla Index visualizzazione:

è specificato eager

È possibile passare il puntatore del mouse su un segmento di tempo per ottenere informazioni dettagliate sulla tempistica:

passare il puntatore del mouse per visualizzare la tempistica dettagliata

Associazione di modelli

La scheda associazione di modelli offre un'ampia gamma di informazioni che consentono di comprendere come le variabili del modulo sono associate e perché alcune non sono associate come previsto. L'immagine seguente mostra l'icona ? , su cui è possibile fare clic per visualizzare la pagina della Guida di visualizzazione per tale funzionalità.

visualizzazione dell'associazione di modelli di intravedere

Route

La scheda Percorsi di visualizzazione consente di eseguire il debug e comprendere il routing. Nell'immagine seguente viene selezionata la route del prodotto (che viene visualizzata in verde, una convenzione di intravedere). nome prodotto selezionato Vengono visualizzati anche vincoli di route, aree e token di dati. Per altre informazioni, vedere Percorsi di visualizzazione e routing degli attributi in ASP.NET MVC 5 .

Uso di Glimpse in Azure

Il criterio di sicurezza predefinito di Glimpse consente di visualizzare solo i dati di Glimpse dall'host locale. È possibile modificare questi criteri di sicurezza in modo da poter visualizzare questi dati in un server remoto , ad esempio un'app Web in Azure. Per gli ambienti di test in Azure, aggiungere il segno evidenziato fino alla fine del file diweb.config per abilitare Glimpse:

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

Con questa modifica, tutti gli utenti possono visualizzare i dati di Glimpse in un sito remoto. Prendere in considerazione l'aggiunta del markup precedente a un profilo di pubblicazione in modo che venga distribuita solo quando si usa tale profilo di pubblicazione, ad esempio il profilo di test di Azure. Per limitare i dati di esplorazione, si aggiungerà il canViewGlimpseData ruolo e si consentirà solo agli utenti di questo ruolo di visualizzare i dati di esplorazione.

Rimuovere i commenti dal file GlimpseSecurityPolicy.cs e modificare la chiamata IsInRole da Administrator al canViewGlimpseData ruolo:

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; }
    }
}

Avviso

Sicurezza: i dati avanzati forniti da Glimpse potrebbero esporre la sicurezza dell'app. Microsoft non ha eseguito un controllo di sicurezza di Glimpse per l'uso nelle app di produzione.

Per informazioni sull'aggiunta di ruoli, vedere l'esercitazione Distribuire un'app Web ASP.NET MVC 5 con appartenenza, OAuth e database SQL ad Azure.

Risorse aggiuntive