采用MiniProfiler监控EF与.NET MVC项目
今天來說說EF與MVC項目的性能檢測和監控,相對本篇文章,更推薦大家使用另一個類似組件?NanoProfiler - 適合生產環境的性能監控類庫 之 基本功能篇
首先,先介紹一下今天我們使用的工具吧.
MiniProfiler~
這個東西的介紹如下:
MVC MiniProfiler是Stack Overflow團隊設計的一款對ASP.NET MVC的性能分析的小程序。可以對一個頁面本身,及該頁面通過直接引用、Ajax、Iframe形式訪問的其它頁面進行監控,監控內容包括數據庫內容,并可以顯示數據庫訪問的SQL(支持EF、EF CodeFirst等 )。并且以很友好的方式展現在頁面上。
該Profiler的一個特別有用的功能是它與數據庫框架的集成。除了.NET原生的 DbConnection類,profiler還內置了對實體框架(Entity Framework)以及LINQ to SQL的支持。任何執行的Step都會包括當時查詢的次數和所花費的時間。為了檢測常見的錯誤,如N+1反模式,profiler將檢測僅有參數值存在差 異的多個查詢。
MiniProfiler是以Apache License V2.0協議發布的,你可以在NuGet找到。配置及使用可以看這里:http://code.google.com/p/mvc-mini-profiler
為建立快速的網站黃金參考標準,雅虎2007年為網站提高速度的13個簡易規則。
以上這一段是照抄的張善友的博客,原文地址:http://www.cnblogs.com/shanyou/archive/2012/04/03/2430977.html
當然 國內百度也能百度出一大把的教程,但是教程都比較老與現在的新版本還是差距很大,而且博文中講的并不是很詳細,所以本屌就來詳細的講講吧..
?
本文采用的環境與技術
系統:WIN7
數據庫:SQL Server2008
相關技術:MVC5+EF6.1.3
第一章:開始監控
首先,明確一下本博文的目標,監控EF的Sql和執行時間,監控MVC頁面的執行時間
那么我們開始.
第一步,從NuGet上下載所需要的包,下載內容如圖:
MiniProfiler核心(所有的MiniProfiler相關資源都需要先有他)
?
這里需要注意,新版本的MiniProfiler.EF是需要根據你的EF版本來下載的,分為MiniProfiler.EF6,MiniProfiler.EF5,MiniProfiler.EF(EF4以下)三個版本
根據你的EF版本自行下載對應的包.
MiniProfiler.MVC4(注:這里的MVC4是可以分析MVC4,5兩個版本的,使用MVC3的同學請自行下載MiniProfiler.MVC3)
至此,我們所需要安裝的程序包就全部OK了,
下面我們開始監控:
首先,給你的Global.asax文件中加入:
protected void Application_BeginRequest(){ ? ? ? ? ?? ? ? ? ??if (Request.IsLocal)//這里是允許本地訪問啟動監控,可不寫 ? ? ? ? ? ?{MiniProfiler.Start();}} ? ? ? ?protected void Application_EndRequest(){MiniProfiler.Stop();}
然后找到你需要監控的頁面,在頁面中加入:
@using StackExchange.Profiling; @MiniProfiler.RenderIncludes();當然,我們一般是想監控所有的頁,所以我推薦加在你的布局頁(_Layout)中,比如以下這種結構:
然后在配置文件中加入(注意,這里很重要):
這樣,我們的基礎監控就已經完成了,我們來看看效果.
?
第二章:監控EF,并對某次操作進行針對性監控
首先我們在Global.asax文件中添加代碼如下: ?
protected void Application_Start()
? ? ? ?{....StackExchange.Profiling.EntityFramework6.MiniProfilerEF6.Initialize();....}
?
因為這是一個簡單的demo,所以我們隨意找一個Controller,寫一些EF的查詢,代碼如下:
public class HomeController : Controller{ ? ? ? ?public ActionResult Index(){ ? ? ? ? ? using (StudentInfoEntities us = new StudentInfoEntities()){ViewBag.data = us.LogData.Where(a => 1 == 1).ToList();} ? ? ? ? ? ?return View();} }
我們來看看效果.
可以看出來,這次查詢用了56.2MS,占用整個頁面的加載時間71%的比例.,點擊藍色的56.2可以看到詳細的SQL語句,如下:
這樣,我們就可以隨時監控到頁面中EF所使用的SQL語句并進行分析.
針對性監控(重要)
當然,這只是簡單的操作,我們在分析的過程中肯定會碰到詭異,或者后臺代碼更復雜的情況(比如一個頁面10個查詢),這個時候頁面上的監控就會很混亂,不方便讀,我們就需要進行針對性的監控.
我們把剛剛的代碼修改如下(這里我們進行兩次查詢操作,用MiniProfiler進行分類):
得到監控效果如下:
這樣,我們就可以根據我們的需要來詳細的跟蹤某一次EF操作的結果了.
?
第三章:監控的權限(給管理員分配監控的權限)
在實際的項目開發中,我們不可能對所有的用戶全部開放監控的權限,所以我們要對他進行顯示的控制.
在MiniProfiler中,提供了兩個委托,如下:
?MiniProfiler.Settings.Results_Authorize //配置監控的權限
MiniProfiler.Settings.Results_List_Authorize //配置歷史信息監控的權限(在~/mini-profiler-resources/results-index中可以查看最近100次的請求分析)
這里我們簡單的做一下權限控制,
我們在Global.asax文件中添加代碼如下:
protected void Application_Start(){....MiniProfiler.Settings.Results_Authorize = Request =>{ ? ? ? ? ? ? ? ?string name = Request.Cookies["name"] == null ? "" : Request.Cookies["name"].Value; ? ? ? ? ? ? ? ?if (name.Equals("admin")) ? ? ? ? ? ? ? ? ? ?return true; ? ? ? ? ? ? ? ?elsereturn false;};StackExchange.Profiling.EntityFramework6.MiniProfilerEF6.Initialize();}
這樣就只有cookie的name屬性為admin的用戶才能有監控顯示了
?
效果如下(我們可以看到,當cookie中的name等于admin的時候才會有監控的顯示):
?
寫在最后
至此,文章就全部結束了,歡迎各位大神拍磚.
原文地址:http://www.cnblogs.com/GuZhenYin/p/5408632.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
贊賞
人贊賞
總結
以上是生活随笔為你收集整理的采用MiniProfiler监控EF与.NET MVC项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JetBrains 加入 .NET 基金
- 下一篇: HoloLens开发手记-凝视 Gaze