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,在数据库里面查看数据:
确定是有数据了,具体就不细看了。
就讲到这,谢谢你们。