MiniProfiler工具介绍

    MiniProfiler是一款针对.NET,
Ruby, Go and Node.js的习性分析的轻量级程序。能够对一个页面本身,及该页面通过一向引用、Ajax、Iframe模式拜访的其他页面举办督察,监控内容囊括数据库内容,并可以显示数据库访问的SQL(协助EF、EF
CodeFirst等 )。并且以很和谐的点子表现在页面上。

    MiniProfiler官网:http://miniprofiler.com/

   
MiniProfiler的一个特别实用的职能是它与数据库框架的三合一。除了.NET原生的
DbConnection类,MiniProfiler还放置了对实业框架(Entity
Framework)以及LINQ to
SQL、RavenDb和MongoDB的援助。任何履行的Step都会席卷当时询问的次数和所花费的光阴。为了检测常见的荒唐,如N+1反模式,profiler将检测仅有参数值存在差此外几个查询。

    MiniProfiler是以Apache License V2.0共谋发表的,你可以在NuGet找到。

  过去径直利用Sqlserver
Profiler,不过发现实际上是太痛苦了,你不得不举办新建、过滤、清除、关闭等操作,而且过滤筛选往往相比难以决定。后来察觉MiniProfiler工具分外好用。

 
同类监控工具有NanoProfiler,下载地址:https://github.com/ef-labs/nanoprofiler/issues/1

Demo演示

Demo开发环境

  • Win10
  • VS2013

未雨绸缪干活

新建MVC项目WebAppEF,使用Northwind数据库。

1、先安装MiniProfiler

Ajax 1

2、安装MiniProfiler.MVC4

Ajax 2

3、安装MiniProfiler.EF

Ajax 3

4、修改Global.asax文件

自身这边只需要在付出条件使用SQL性能监控,所以使用了#if
DEBUG,因为生产环境,大家一般是使用release形式。同时,MiniProfiler还援助授权,这里不做牵线。

using StackExchange.Profiling;
using StackExchange.Profiling.EntityFramework6;
using System;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebAppEF
{
publicclassMvcApplication : System.Web.HttpApplication
    {
protectedvoid Application_Start()
        {
#if DEBUG
MiniProfilerEF6.Initialize();
#endif
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
protectedvoid Application_BeginRequest(Object source, EventArgs e)
        {
#if DEBUG
MiniProfiler.Start();
#endif
        }
protectedvoid Application_EndRequest()
        {
#if DEBUG
MiniProfiler.Stop();
#endif
        }
    }
}

5、在你的布局页(_Layout)中,比如以下这种社团,修改_Layout.cshtml

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

6、修改配置文件Web.config

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

Ajax 4

7、添加控制器测试代码

        public ActionResult Index()
        {
            // create the entity object
            using (NorthwindEntities mobjentity = new NorthwindEntities())
            {
                ViewBag.SelectCustomer = mobjentity.Customers.Select(x => x.City == "Delhi").ToList();
            }

            var profiler = MiniProfiler.Current;
            using (profiler.Step("查询Customers的数据"))
            {
                using (NorthwindEntities entity = new NorthwindEntities())
                {
                    ViewBag.data = entity.Customers.ToList();
                }
            }
            return View();
        }

8、按F5调试运行

Ajax 5Ajax 6Ajax 7

说明:标记为duplicate的部分,代表在一次请求当中,重复执行了查询,可以进行优化。通过Step可以对独立的sql块进行标记。

大面积错误

1、The Entity Framework was already using a DbConfiguration instance before an attempt was made to add an ‘Loaded’ event handler. ‘Loaded’ event handlers can only be added as part of application start up before the Entity Framework is used. See http://go.microsoft.com/fwlink/?LinkId=260883 for more information.

Ajax 8

解析:错误提醒的不经意是在盘算为DbConfiguration
实例加Loaded事件以前早已在此外地方采用了这一个实例了

缓解方案:把MiniProfiler.EF6.Initialize()在位于Database.SetInitializer<WebAppEF.Models.NorthwindEntities>(null);
在此之前。

2、Could not load file or assembly ‘MiniProfiler, Version=3.0.11.0, Culture=neutral, PublicKeyToken=b44f9351044011a3’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Ajax 9

浅析:找不到MiniProfiler程序集或者它的依靠项。程序集定义和引用不般配。

釜底抽薪方案:查看Web.config中是不是存在如下配置节点

<dependentAssembly>
<assemblyIdentityname="MiniProfiler"publicKeyToken="b44f9351044011a3"culture="neutral" />
<bindingRedirectoldVersion="0.0.0.0-3.2.0.157"newVersion="3.2.0.157" />
</dependentAssembly>

倘使不设有则增长,假设存在,则检查MiniProfiler版本号和packages.config中的版本号是否一律,即便不一样就要对版本号进行改动。

参考:

Ajax,行使MiniProfiler调试ASP.NET
MVC网站性能

动用MiniProfiler监控EF与.NET MVC项目(Entity Framework
延伸体系1)

相关文章