使用 Glimpse 分析 ASP.NET MVC 應用程式以對其進行偵錯

作者: Rick Anderson

Glimpse 是開放原始碼 NuGet 套件的一系列,可為 ASP.NET 應用程式提供詳細的效能、偵錯和診斷資訊。 安裝、輕量型、超快速,並在每一頁底部顯示關鍵效能計量十分簡單。 當您需要瞭解伺服器上的運作情況時,它可讓您向下切入應用程式。 Glimpse 提供非常寶貴的資訊,建議您在整個開發週期使用它,包括您的 Azure 測試環境。 雖然 FiddlerF-12 開發工具提供用戶端檢視,但 Glimpse 會從伺服器提供詳細的檢視。 本教學課程將著重于使用 Glimpse ASP.NET MVC 和 EF 套件,但提供許多其他套件。 可能的話,我將會連結至協助維護的適當 Glimpse 檔 。 Glimpse 是開放原始碼專案,您也可以參與原始程式碼和檔。

安裝 Glimpse

您可以從 NuGet 套件管理員主控台或 從管理 NuGet 套件主控台安裝 Glimpse 。 在此示範中,我將安裝 Mvc5 和 EF6 套件:

從 NuGet Dlg 安裝 Glimpse

搜尋 Glimpse.EF

從 NuGet 安裝 dlg 的 Glimpse.EF

藉由選取 [已安裝的套件],您可以看到已安裝的 Glimpse 相依模組:

從 DLg 安裝的 Glimpse 套件

下列命令會從套件管理員主控台安裝 Glimpse MVC5 和 EF6 模組:

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

啟用 localhost 的 Glimpse

流覽至 http://localhost:< 埠 # > /glimpse.axd,然後按一下 [ 開啟] 按鈕。

Glimpse axd 頁面

如果您已顯示我的最愛列,您可以拖放 [Glimpse] 按鈕,並將其新增為 bookmarklet:

具有 Glimpse bookmarklet 的 IE

您現在可以流覽應用程式,而且頁面底部會顯示 [ 頭頭顯示 ] (HUD) 。

具有 HUD 的連絡人管理員頁面

[Glimpse HUD] 頁面詳細說明上面顯示的計時資訊。 HUD 顯示的不幹擾效能資料可以立即通知您有問題,再進入測試週期。 按一下右下角的 「g」 會顯示 [Glimpse] 面板:

Glimpse 面板

在上圖中,已選取 [執行] 索引標籤,其中顯示管線中動作和篩選的計時詳細資料。 您可以在管線的第 6 階段開始看到 [ 停止監看式] 篩選計時器 。 雖然我的輕量計時器可以提供實用的設定檔/計時資料,但它會遺漏授權和轉譯檢視所花費的所有時間。 您可以在設定檔和時間閱讀我的計時器 ,ASP.NET MVC 應用程式一路前往 Azure

[時間軸] 索引標籤

我已修改 Tom Dykstra 的未處理 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 載入的每個註冊:

明確式載入

在下列程式碼中,會指定積極式,並在呼叫檢視之後 Index 擷取每個註冊:

已指定積極式

您可以將滑鼠停留在時間區段上,以取得詳細的計時資訊:

暫留以查看詳細時間

模型繫結

[模型系結] 索引標籤提供豐富的資訊,可協助您瞭解表單變數的系結方式,以及為何有些未如預期般系結。 下圖顯示 圖示,您可以按一下該圖示來顯示該功能的 [概觀說明] 頁面。

查看模型系結檢視

路由

[Glimpse 路由] 索引標籤可協助您偵錯和瞭解路由。 在下圖中,系統會選取產品路由 (,並以綠色顯示,即 Glimpse 慣例) 。 已選取產品名稱 也會顯示路由條件約束、區域和資料權杖。 如需詳細資訊 ,請參閱 ASP.NET MVC 5 中的 Glimpse 路由和屬性路由。

在 Azure 上使用 Glimpse

Glimpse 預設安全性原則只允許從本機主機顯示 Glimpse 資料。 您可以變更此安全性原則,以便在遠端伺服器上檢視此資料, (例如 Azure) 上的 Web 應用程式。 針對 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 所提供的豐富資料可能會公開應用程式的安全性。 Microsoft 尚未對 Glimpse 執行安全性稽核,以用於生產應用程式。

如需新增角色的資訊,請參閱使用成員資格、OAuth 和SQL Database部署安全 ASP.NET MVC 5 Web 應用程式教學課程。

其他資源