MiniProfiler,一个.NET简单但有效的微型分析器

背景

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

概述

在WebApi中,对其性能进行分析监测是很有必要的。而悲剧的是,MVC项目中可以使用的MiniProfiler或Glimpse等,这些都不支持WebApi项目,而且WebApi项目通常也没有界面,不能进行性能分析的交互。在这篇文章中,我们就来一步步实现为WebApi项目集成Miniprofiler。集成后,我们可以监控EF执行效率,执行语句,页面执行时间等,这些结果将以很友好的方式显示在界面上。

问题

本质上,集成Miniprofiler可以分解为三个问题:

  1. 怎样监测一个WebApi项目的性能。

  2. 将性能分析监测信息从后端发送到UI。

  3. 在UI显示分析监测结果。

实现方式

首先安装Miniprofiler,MiniProfiler.EF6

在Global.asax  加入

using BQoolCommon.Helpers.Model;
using Elmah;
using ResearchManager.Web.App_Start;
using System;
using System.Configuration;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using StackExchange.Profiling;
using StackExchange.Profiling.Mvc;
using StackExchange.Profiling.EntityFramework6;
using System.Web.Optimization;
using NLog;
using ResearchManager.Models.ValidateAttribute;namespace ResearchManager.Web
{public class MvcApplication : HttpApplication{protected void Application_Start(){AreaRegistration.RegisterAllAreas();FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);//Remove Header X-AspNetMvc-VersionMvcHandler.DisableMvcResponseHeader = true;AutofacConfig.Bootstrapper();//在 Controller 之前對 Model 做處理(字串 Trim)ModelBinders.Binders.DefaultBinder = new BQoolModelBinder();//註冊自訂的 Validation (複寫預設的錯誤訊息)CustomerValidation.RegisterCustomerValidation();DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomizedRequired), typeof(RequiredAttributeAdapter));DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomizedStringLength), typeof(StringLengthAttributeAdapter));#region 测试//if (bool.Parse(ConfigurationManager.AppSettings["MiniProfiler"] ?? "false"))//{MiniProfiler.Configure(new MiniProfilerOptions{RouteBasePath = "~/profiler",PopupRenderPosition = RenderPosition.Right,  // defaults to leftPopupMaxTracesToShow = 10,                   // defaults to 15ResultsAuthorize = request => request.IsLocal,ResultsListAuthorize = request =>{return true; // all requests are legit in this example},// Stack trace settingsStackMaxLength = 256, // default is 120 charactersTrackConnectionOpenClose = true}.ExcludeType("SessionFactory")  // Ignore any class with the name of SessionFactory).ExcludeAssembly("NHibernate")  // Ignore any assembly named NHibernate.ExcludeMethod("Flush")         // Ignore any method with the name of Flush.AddViewProfiling()              // Add MVC view profiling (you want this));MiniProfilerEF6.Initialize();//}#endregion 测试}protected void Application_BeginRequest(Object source, EventArgs e){BundleTable.EnableOptimizations = false;#region 测试MiniProfiler.StartNew();#endregion 测试}protected void Application_EndRequest(){#region 测试//MiniProfiler.Current?.Stop(); // Be sure to stop the profiler!#endregion 测试}#region Elmahprivate static readonly string _exceptionMsg = "A potentially dangerous Request.Path value was detected from the client";protected void Application_Error(object sender, EventArgs e){Exception ex = Server.GetLastError();Logger nlogger = LogManager.GetCurrentClassLogger();nlogger.Error(ex);if (BQoolCommon.Helpers.Setting.CommonSetting.IsProd()){if (e is ExceptionFilterEventArgs exceptionFilter){if (exceptionFilter.Exception is HttpException httpException && httpException.Message.StartsWith(_exceptionMsg)){Response.Redirect("/");}}Response.Clear();Server.ClearError();Response.StatusCode = 404;}}/// <summary>/// 排除 Elmah 404 寄信通知/// </summary>public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e){if (e.Exception is HttpException httpException && (httpException.GetHttpCode() == 404 || httpException.Message.StartsWith(_exceptionMsg))){e.Dismiss();}}/// <summary>/// 自定 Elmah 發信主旨/// </summary>private void ErrorMail_Mailing(object sender, Elmah.ErrorMailEventArgs e){string machineName = "none server";try{if (Request != null){machineName = Request.ServerVariables["HTTP_HOST"];}}catch{}// 取得 Elamh ErrorMail 的主旨// "$MachineName$ at $ErrorTime$ : {0}"string elmahSubject = e.Mail.Subject;//替換 ErrorMail 的主旨內容string emailSubject = string.Format("ResearchManager.Web Error => {0}",elmahSubject.Replace("$MachineName$", machineName));e.Mail.Subject = emailSubject;}#endregion Elmah}
}

运行效果

运行项目,http://localhost//profiler/results-index  即可看到监测结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle类似isempty,NULLs和empty strings在不同数据库的中特点

1.以oracle为例SQL> create table test(id int primary key,content varchar(20));SQL> INSERT INTO test (id, content) VALUES (1, NULL);SQL> INSERT INTO test (id, content) VALUES (2, );SQL> INSERT INTO test (id, content) VALUES (3, );SQL> INSERT …

龙芯.NET正式发布 稳步推进生态建设

2020年12月19日&#xff0c;2020中国. NET开发者大会于苏州开幕。此次大会上&#xff0c;龙芯发布了龙芯.NET 3。龙芯.NET 3基于.NET Core 3.1&#xff0c;支持该版本具备的所有主要功能&#xff0c;包括GC、AOT等。CoreCLR、CoreFX、ASP.NET Core等库的测试通过情况与x64/arm6…

有温度的技术,改善上亿人的生活

06有温度的技术&#xff0c;改善上亿人的生活鱼小皮哥&#xff0c;现在的 APP 真是越来越难用了&#xff0c;功能多、操作复杂、广告更多。唉&#xff0c;可不是么&#xff0c;而且人们的生活已经离不开 APP 了&#xff01;老百鱼小皮我爷爷最近的视力下降的很快&#xff0c;用…

Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...

三、 Linux 系统目录结构/bin — 用来贮存用户命令。目录 /usr/bin 也被用来贮存用户命令。/sbin — 许多系统命令(例如 shutdown)的贮存位置。目录 /usr/sbin 中也包括了许多系统命令。/root — 根用户(超级用户)的主目录。/mnt — 该目录中通常包括系统引导后被挂载的文件系统…

linux脚本传参修改配置文件,shell脚本修改配置文件指定行的值

配置文件内容为Version1ExpireTime300MaxProcessTime15MaxQueueSize2000MaxStatisticsTime1000000StatisticsCount10根据关键字MaxStatisticsTime获取行号,修改对应的value值change_file.sh#!/bin/bashfile_name"config.xml"key_value"MaxStatisticsTime"c…

刚转Java?那准备转回.NET5吧!

再过几天就2021年了&#xff0c;回首今年最大的变化就是.NET5的发布&#xff0c;终结了.NET Framework和.NET Core两个分支。虽然因为新冠疫情原因&#xff0c;原定于.NET5的部分功能被推迟到.NET6了&#xff0c;但.NET5是一个非常非常重要的版本&#xff0c;会载入史册的一个版…

azure linux 多磁盘 lvm,EVE-NG扩展磁盘空间(扩展LVM卷)

环境准备系统环境&#xff1a;EVE-PRO-VM-2.0.4-20前期是使用ova导入安装&#xff0c;精简置备&#xff0c;40G虚拟磁盘容量。空间不足&#xff0c;尝试了很久&#xff0c;记录操作记录如下&#xff1a;血泪教训&#xff1a;操作不当有可能引起数据丢失&#xff0c;需要提前备份…

在 xunit 测试项目中使用依赖注入

在 xunit 测试项目中使用依赖注入Intro之前写过几篇 xunit 依赖注入的文章&#xff0c;今天这篇文章将结合我在 .NET Conf 上的分享&#xff0c;更加系统的分享一下在测试中的应用案例。之所以想分享这个话题是因为我觉得在我们开发过程中测试是非常重要的一部分&#xff0c;高…

linux 端口qos,linux的qos机制 - cgroup篇 (2)

这篇重点讲述cgroup如何控制blkio子系统的qos&#xff0c;首先看下设置blkio.weight blkio.weight_device我的理解是blkio.weight是整个io子系统的权重值&#xff0c;而blkio.weight_device是针对特定的major:minor 设备的权重blkio.throttle.read_bps_device blkio.throttle.w…

利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具

利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具独立观察员 2020 年 12 月 26 日前一段看到微信公众号 “码农读书” 上发了一篇文章《如何使用 C# 中的 FileSystemWatcher》&#xff08;翻译自&#xff1a;https://www.infoworld.com/article/3185447/how-to-work-w…

u盘安全删除 linux,为什么要安全删除U盘

原标题&#xff1a;为什么要安全删除U盘移除闪存设备时会对电脑造成危害吗&#xff1f;我们为什么要安全的移除它们&#xff1f;历史上&#xff0c;操作系统将磁盘作为信任对象不需要突然改变状态。当读写文件时&#xff0c;操作系统不希望文件在读写的过程中突然消失。如果文件…

如何在 C# 中使用 投影(Projection)

投影(Projection) 是一种可以将查询结果进行 塑性 的一种操作&#xff0c;你可以使用 投影 将一个 object 转成仅包含你需要属性的新对象&#xff0c;这篇文章中&#xff0c;我们就一起看看如何使用 投影 功能。C# 中的投影 LINQ 集成查询中有两个支持投影的扩展方法&#xff0…

Linux vi 双屏显示,manjaro AwesomeWM 上使用双显示器

安装manjaro时使用独显的单显示器&#xff0c;在主板上接第二个显示器一直没反应。几个问题和解决BIOS里检查是否关闭了集显开关大多数显卡的默认设置都会在识别独显后关闭集显&#xff0c;要使用集显上的接口需要单独设置。如果接口允许&#xff0c;最好将两个显示器都接在独显…

asp.net core中使用cookie身份验证

背景ASP.NET Core Identity 是一个完整的全功能身份验证提供程序&#xff0c;用于创建和维护登录名。 但是&#xff0c; cookie 不能使用基于的身份验证提供程序 ASP.NET Core Identity 。配置在 Startup.ConfigureServices 方法中&#xff0c;创建具有 AddAuthentication 和 A…

Linux语言写的高通滤波,高通滤波器c语言实现

描述高通滤波器&#xff0c;又称低截止滤波器、低阻滤波器&#xff0c;允许高于某一截频的频率通过&#xff0c;而大大衰减较低频率的一种滤波器。它去掉了信号中不必要的低频成分或者说去掉了低频干扰。高通滤波器是一种让某一频率以上的信号分量通过&#xff0c;而对该频率以…

在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门

翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 [1].NET 是一个开源软件框架&#xff0c;用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu [2]允许您同时为 Ubuntu 和 Windows 构…

linux 全双工 wifi热点,Linux中的同时套接字读/写(“全双工”)(特别是aio)

我正在移植构建在ACE Proactor框架之上的应用程序.该应用程序适用于VxWorks和Windows,但在使用librt的内核2.6.X.X的Linux(CentOS 5.5,WindRiver Linux 1.4和3.0)上无法运行.我把问题缩小到一个非常基本的问题&#xff1a;应用程序在套接字上开始异步(通过aio_read)读取操作,然…

明源云·天际,地产⾏业的Salesforce Lightning Platform

源宝导读&#xff1a;2020年11月6日&#xff0c;明源云在CIO峰会上正式对外发布了“天际开放平台”&#xff0c;这是明源云凝聚其20多年行业经验打造的一款企业级PaaS平台。本文将介绍我们对企业级PaaS平台的行业思考&#xff0c;以及为加速泛地产生态链数字化转型而做的技术创…

c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...

置顶欢迎大家选修C语言程序设计这门课&#xff0c;本帖解释一下一些常见的问题叶卡林娜发表于2017年01月05日首先欢迎大家选修浙大翁恺老师的C语言程序设计课程。开课2天就看到讨论区已经有这么多帖子&#xff0c;说明同学们的学习热情很高。结合前几次开课的经验以及目前在讨论…

IdentityServer4系列 | 支持数据持久化

一、前言在前面的篇章介绍中&#xff0c;一些基础配置如API资源、客户端资源等数据以及使用过程中发放的令牌等操作数据&#xff0c;我们都是通过将操作数据和配置数据存储在内存中进行实现的&#xff0c;而在实际开发生产中&#xff0c;我们需要考虑如何处理数据持久化呢&…