使用 MiniProfiler 來分析 ASP.NET Core 應用

MiniProfiler(https://miniprofiler.com/)是一個輕量級且簡單易用的分析工具庫,它能夠用來分析ASP.NET Core應用。html

 

優勢

針對ASP.NET Core MVC應用,使用MiniProfiler的優勢是:它會把結果直接放在頁面的左下角,隨時能夠點擊查看;這樣的話就能夠感知出你的程序運行的怎麼樣;同時這也意味着,在你開發新功能的同時,能夠很快速的獲得反饋。數據庫

 

安裝配置MiniProfiler

在現有的ASP.NET Core MVC項目裏,經過Nuget安裝:json

接下來,想把MiniProfiler配置好,總共分三步😂:設計模式

第一步,來到StartUp.cs的ConfigureServices方法裏,添加 services.AddMiniProfiler()app

固然這個方法還能夠添加一個lambda表達式做爲參數,從而作一些自定義的配置:ide

能夠看到可用的配置選項仍是不少,具體還須要看官方文檔。函數

在這個例子裏,我就只使用兩個選項吧:工具

第一行是設定彈出窗口的位置是左下角;第二行是在彈出的明細窗口裏會顯式Time With Children這列。spa

 

第二步,來到Startup的Configure方法裏,添加app.UseMiniProfiler()設計

最重要的一點是,必定要把它放在UseMvc()方法以前。 

這裏就是配置中間件在管道中的位置,想必你們都瞭解。

 

第三步,就是把MiniProfiler的Tag helper放到頁面上

這裏還分兩步:

1. 在_ViewImports裏面把它的Tag Helper全引入進來:

 

一共又有兩行代碼:

@using StackExchange.Profiling
@addTagHelper *, MiniProfiler.AspNetCore.Mvc

 

2.最後,須要把MiniProfiler的Tag Helper放在_Layout.cshtml裏

放在這裏的話,每一個頁面就都能看到它了。

其實放在這個頁面的什麼地方都應該能夠,可是因爲它會加載一些腳本文件,因此我放在footer下面:

 

運行應用,能夠看到左下角就是MiniProfiler:

 

點擊它以後會彈出窗口:

這裏面有每一個步驟具體的耗用時間。

 

分析局部代碼

前面的例子裏,咱們使用MiniProfiler分析了頁面整個流程的時間。而MiniProfiler也能夠用來分析一段代碼所耗用的時間。看例子:

(注意,若是這段代碼不在主Web項目裏,你須要在那段代碼所在的項目添加MiniProfiler.AspNetCore這個庫)

而後這樣用就能夠了:

這裏咱們使用了using語句,裏面使用了MiniProfiler類的Current屬性,在該屬性上面有一個Step()方法,它能夠用來分析using語句裏面的代碼,在Step方法裏,要提供一個具備描述性的名稱來表示該段代碼作的是什麼動做,這個名稱會顯示在結果裏。

 

一般,我會嵌套着使用:

若是你只想分析一句話,那麼使用using語句就顯得太麻煩了,這種狀況下可使用Inline()方法:

該方法能夠保證獲得的結果是相同類型的。

 

運行程序,點擊左下角的按鈕:

能夠看到剛纔那幾塊代碼的分析結果按照其嵌套解構展現出來了。

 

自定義分析 CustomTiming

有時候,分析一些例如請求外部動做的時候,上面講的作法可能不太靈光,這裏咱們就可使用CustomTiming()方法。

直接看例子:

這個例子裏,咱們使用了MiniProfiler.Current.CustomTiming()方法。方法第一個參數是一個用於分類的字符串,因爲我這個例子是http請求,因此第一個參數我寫的是http;第二個參數是命令字符串,暫時留空,第三個參數是執行類型,這裏我是用的是HTTPGet,因此就寫了GET。

而後在response返回以後,我再把命令字符串給補上。這裏就須要引用一下CustomTiming()方法返回的對象,因此在using語句裏我添加了一個變量timing。在response返回後,我設置了timing變量的命令字符串爲URL和返回的狀態碼,由於我感受這樣寫才能夠更準確的代表此次動做。而狀態碼只有response返回以後纔有,因此在using語句裏調用CustomTiming()方法時,我暫時把第二個命令設置爲空字符串。

 

運行程序,能夠看到彈出窗口的右側出現了http這一列:

點擊這個1437.7(1),會再彈出一個窗口:

能夠看到這就是咱們使用CustomTiming分析的那段代碼,URL和返回碼都顯示了出來。

 

若是須要分析全部的HttpClient的請求,那麼你能夠在Http管道里放一個DelegatingHandler,具體說就是建立一個類,繼承於DelegatingHandler,只須要重寫一個叫作SendAsync的方法,把分析的代碼寫在這個方法裏便可,最後須要在HttpClientFactory裏面進行配置。這部分代碼我先不寫,之後再說。

而若是不是HttpClient的請求,那麼你能夠本身寫一個Wrapper或經過裝飾者設計模式來實現。。。

 

在WebApi項目裏使用MiniProfiler而且分析 Entity Framework Core

我換了一個ASP.NET Core Web API的解決方案,它用到了Entity Framework Core。

基本配置和上面是同樣的,只不過不須要使用TagHelper了。

須要安裝MiniProfiler.EntityFrameworkCore,注意無論使用EFCore的項目在哪,你仍是須要把這個庫安裝在主Web項目裏:

首先添加一個配置選項,用於訪問分析結果;而後在以前的配置後邊加上AddEntityFramework()便可:

 

運行程序,這時一共有三個查看分析結果相關的URL地址:

  • /profiler/results-index
  • /profiler/results
  • /profiler/results-list

 先看results-index:

什麼也沒有,這時由於我尚未調用任何API,接下來就調用一個API,而後再查看該頁面:

這個頁面自動刷新了,出現了剛纔調用API的結果。能夠看到總時間爲3066毫秒。

 

再看result-list頁面:

其實就是分析結果的json數據。

 

最後從result-index頁面點擊連接進入此次API調用的詳細結果頁面,也就是result頁面:

最上面列表的最後一列括號外的數據是執行SQL語句的總耗時,而括號裏面是指一共執行了4個語句。

下面那一大片就是整個過程當中每步的分析結果明細,這裏包含了四個SQL語句,可是截圖不全。

 

對分析結果進行訪問控制

你確定不想讓任何人都看到MiniProfiler的分析結果,這就須要你對其進行訪問權限控制。

在Startup.cs的ConfigureServices方法裏,再添加兩個配置:

ResultsAuthorize的參數是一個Func,參數是HttpRequest,返回類型爲bool,在這裏你就能夠寫一個函數來判斷用戶的身份。返回true就表明用戶有權限。

UserIdProvider,它的參數也是一個Func,用來爲當前請求的用戶返回他的ID或用戶名(惟一的)。這個項目裏我可使用User.Identity.Name。

 

當用戶沒登陸的時候:

左下角不顯示分析結果按鈕了。

 

登陸一個admin角色的用戶之後:

左下角出現告終果,而且只是當前用戶操做的分析結果。

 

把分析結果存到數據庫

你可能須要把分析結果持久話,例如存到數據庫裏。

這時你須要安裝一個MiniProfiler的存儲提供商:

 

我這裏使用的是SqlServer,因此安裝SqlServer那個:

 

一般這種數據是放在一個單獨的數據庫裏,因此添加一個數據庫鏈接字符串:

 

再來到Startup的ConfigureServices裏,獲取ConnectionString,而後設置Storage選項便可:

 

最後,還須要建立MiniProfiler所使用的數據庫表,這些建立表的SQL語句存在於SqlServerStorage對象的TableCreationScripts裏,你能夠在程序的某個地方貼上以下代碼:

 

而後把SQL語句複製下來並執行,從而生成表😂:

 

執行完之後,表以下:

 

運行程序,調用API,在數據庫裏面查看數據:

確定是有數據了,具體就不細看了。

 

就講到這,謝謝你們。

相關文章
相關標籤/搜索