zoukankan      html  css  js  c++  java
  • 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

    Entity Framework 延伸系列目录

    今天来说说EF与MVC项目的性能检测和监控

    首先,先介绍一下今天我们使用的工具吧.

    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)中,比如以下这种结构:

    <html>
    <head>
        @using StackExchange.Profiling;
    </head>
    <body>
            @RenderBody()
    
        @MiniProfiler.RenderIncludes();
    </body>
    </html>

    然后在配置文件中加入(注意,这里很重要):

    <system.webServer>
          <handlers>
            <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
          </handlers>
      </system.webServer>

    这样,我们的基础监控就已经完成了,我们来看看效果.

    第二章:监控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进行分类):

    复制代码
      public class HomeController : Controller
        {
            public ActionResult Index()
            {
                var profiler = MiniProfiler.Current;
                using (profiler.Step("查询数据LogData的数据"))
                {
                    using (StudentInfoEntities us = new StudentInfoEntities())
                    {
                        ViewBag.data = us.LogData.Where(a => 1 == 1).ToList();
                    }
                }
    
                using (profiler.Step("查询数据LogOperate的数据"))
                {
                    using (StudentInfoEntities us = new StudentInfoEntities())
                    {
                        ViewBag.data = us.LogOperate.Where(a => 1 == 1).ToList();
                    }
                }
                return View();
            }
    }
    复制代码

    得到监控效果如下:

    这样,我们就可以根据我们的需要来详细的跟踪某一次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;
                    else
                        return false;
                };
                   
                StackExchange.Profiling.EntityFramework6.MiniProfilerEF6.Initialize();
    
            }
    复制代码

    这样就只有cookie的name属性为admin的用户才能有监控显示了

    效果如下(我们可以看到,当cookie中的name等于admin的时候才会有监控的显示):

    写在最后

    至此,文章就全部结束了,欢迎各位大神拍砖.

    作者:顾振印 出处:http://www.cnblogs.com/GuZhenYin/ 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
  • 相关阅读:
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
    java io系列20之 PipedReader和PipedWriter
    java io系列19之 CharArrayWriter(字符数组输出流)
    java io系列18之 CharArrayReader(字符数组输入流)
    java io系列17之 System.out.println("hello world")原理
    java io系列16之 PrintStream(打印输出流)详解
    java io系列15之 DataOutputStream(数据输出流)的认知、源码和示例
    java io系列14之 DataInputStream(数据输入流)的认知、源码和示例
  • 原文地址:https://www.cnblogs.com/bubugao/p/mvcef.html
Copyright © 2011-2022 走看看