MiniProfiler(https://miniprofiler.com/)是一個輕量級且簡單易用的分析工具庫,它能夠用來分析ASP.NET Core應用。html
針對ASP.NET Core MVC應用,使用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()方法。
直接看例子:
這個例子裏,咱們使用了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或經過裝飾者設計模式來實現。。。
我換了一個ASP.NET Core Web API的解決方案,它用到了Entity Framework Core。
基本配置和上面是同樣的,只不過不須要使用TagHelper了。
須要安裝MiniProfiler.EntityFrameworkCore,注意無論使用EFCore的項目在哪,你仍是須要把這個庫安裝在主Web項目裏:
首先添加一個配置選項,用於訪問分析結果;而後在以前的配置後邊加上AddEntityFramework()便可:
運行程序,這時一共有三個查看分析結果相關的URL地址:
先看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,在數據庫裏面查看數據:
確定是有數據了,具體就不細看了。
就講到這,謝謝你們。