Профилирование и отладка приложения ASP.NET MVC с помощью Glimpse

Рик Андерсон

Glimpse — это процветающее и растущее семейство открытый код пакетов NuGet, которое предоставляет подробные сведения о производительности, отладке и диагностике для ASP.NET приложений. Это тривиально установить, упрощенный, сверхбыстрый, и отображать ключевые метрики производительности в нижней части каждой страницы. Это позволяет детализировать приложение, когда вам нужно узнать, что происходит на сервере. Glimpse предоставляет так много ценных сведений, которые мы рекомендуем использовать на протяжении всего цикла разработки, включая тестовую среду Azure. Хотя Fiddler и средства разработки F-12 предоставляют представление на стороне клиента, Glimpse предоставляет подробное представление с сервера. В этом руководстве основное внимание уделяется использованию пакетов Glimpse ASP.NET MVC и EF, но доступны многие другие пакеты. По возможности я буду ссылаться на соответствующие документы Glimpse , которые я помогаю поддерживать. Glimpse — это открытый код проект, вы также можете внести свой вклад в исходный код и документацию.

Установка Glimpse

Glimpse можно установить из консоли диспетчера пакетов NuGet или консоли управления пакетами NuGet . Для этой демонстрации я установлю пакеты Mvc5 и EF6:

установка Glimpse из NuGet Dlg

Поиск по запросу Glimpse.EF

Glimpse.EF из NuGet установить dlg

Выбрав Установленные пакеты, вы увидите установленные зависимые модули Glimpse:

Установленные пакеты Glimpse из DLg

Следующие команды устанавливают модули Glimpse MVC5 и EF6 из консоли диспетчера пакетов:

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

Включение Glimpse для localhost

Перейдите к http://localhost:<порту #>/glimpse.axd и нажмите кнопку Включить представление.

Glimpse axd page

Если отображается панель избранного, вы можете перетащить кнопки Glimpse и добавить их в качестве букмарклетов:

IE с Glimpse bookmarklets

Теперь вы можете перемещаться по приложению, а в нижней части страницы отобразится экран Heads Up Display (HUD).

Страница

На странице Glimpse HUD подробно описаны сведения о времени, показанные выше. Ненавязчивые данные о производительности, отображаемые HUD, могут сразу же уведомить вас о проблеме, прежде чем вы приступите к циклу тестирования. Щелкнув "g" в правом нижнем углу, открывается панель Glimpse:

Панель Glimpse

На рисунке выше выбрана вкладка Выполнение, на которой отображаются сведения о времени действий и фильтров в конвейере. Вы увидите, как таймер фильтра Stop Watch запускается на этапе 6 конвейера. Хотя мой легкий таймер может предоставлять полезные данные профиля и времени, он пропускает все время, затраченное на авторизацию и отрисовку представления. Сведения о моем таймере см. в статье Профилирование и время ASP.NET приложения MVC вплоть до Azure.

Вкладка "Временная шкала"

Я изменил выдающийся учебник Тома Дайкстры по EF 6/MVC 5 с помощью следующего изменения кода для контроллера инструкторов:

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

Приведенный выше код позволяет передать строку запроса (eager) для управления неотложной или явной загрузкой данных. На рисунке ниже используется явная загрузка, а на странице времени отображается каждая регистрация, загруженная в методе Index действия:

явная загрузка

В следующем коде указывается значение eager, и каждая регистрация извлекается после Index вызова представления:

указано значение eager

Вы можете навести указатель мыши на сегмент времени, чтобы получить подробные сведения о времени:

Наведите указатель мыши, чтобы просмотреть подробные сведения о времени

Привязка модели

Вкладка привязки модели содержит множество сведений, которые помогут вам понять, как связаны переменные формы и почему некоторые из них не связаны должным образом. На рисунке ниже показан значок ? , который можно щелкнуть, чтобы открыть страницу справки по этой функции.

Представление привязки модели взгляда

Маршруты

Вкладка Glimpse Routes поможет выполнить отладку и понять маршрутизацию. На изображении ниже выбран маршрут продукта (он отображается зеленым цветом, соглашение Glimpse). выбрано название продукта Также отображаются ограничения маршрута, области и маркеры данных. Дополнительные сведения см. в статье Просмотр маршрутов и маршрутизации атрибутов в ASP.NET MVC 5 .

Использование Glimpse в Azure

Политика безопасности Glimpse по умолчанию позволяет отображать данные Glimpse только с локального узла. Вы можете изменить эту политику безопасности, чтобы просматривать эти данные на удаленном сервере (например, в веб-приложении в Azure). Для тестовых сред в Azure добавьте выделенную метку в нижнюю часть файла web.config , чтобы включить Glimpse:

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

Только с этим изменением любой пользователь может просматривать данные Glimpse на удаленном сайте. Рассмотрите возможность добавления приведенной выше разметки в профиль публикации, чтобы она развертывалась только при использовании этого профиля публикации (например, тестового профиля Azure). Чтобы ограничить данные Glimpse, мы добавим canViewGlimpseData роль и разрешим просматривать данные Glimpse только пользователям с этой ролью.

Удалите комментарии из файла GlimpseSecurityPolicy.cs и измените вызов IsInRole с Administrator на canViewGlimpseData роль:

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

Предупреждение

Безопасность. Богатые данные, предоставляемые Glimpse, могут обеспечить безопасность вашего приложения. Корпорация Майкрософт не выполняла аудит безопасности Glimpse для использования в рабочих приложениях.

Сведения о добавлении ролей см. в руководстве Развертывание защищенного веб-приложения MVC 5 ASP.NET с использованием членства, OAuth и База данных SQL в Azure.

Дополнительные ресурсы