ASP.NET Web API 接口执行时间监控

软件产品常常会出现这样的情况:产品性能因某些无法预料的瓶颈而受到干扰,导致程序的处理效率降低,性能得不到充分的发挥。如何快速有效地找到软件产品的性能瓶颈,则是我们感兴趣的内容之一。

在本文中,我将解释我如何清理和替换重复、 混乱遍布许多方法在应用程序中的代码使用ASP.NET Web API 的筛选器来完成ASP.NET Web API 接口执行时间监控。我们的项目中有如下的需求:我的工作相关的项目 (使用 ASP.NET Web API 框架) 要求记录下服务接口的调用执行时间以及请求延迟、 故障率每秒的请求总数,以帮助运营团队。 

Web API 筛选器是你放到Action上的自定义属性方法 (或Controller) 添加常用功能。 Web API 筛选使您得以添加预处理和后处理的行为,本文的代码来自于How to intercept all the ASP.NET WebApi controller action methods calls with Ninject interception for logging?Log duration of an ASP Web API action

下面是详细代码:

using System; 
using System.Collections.Generic;    
using System.Diagnostics;    
using System.Linq;    
using System.Web;    
using System.Web.Http.Controllers;    
using System.Web.Http.Filters;
namespace ContactManager.Filters   
{    
    public class TimingActionFilter : ActionFilterAttribute    
    {    
        private const string Key = "__action_duration__";
        public override void OnActionExecuting(HttpActionContext actionContext)   
        {    
            if (SkipLogging(actionContext))    
            {    
                return;    
            }    
            var stopWatch = new Stopwatch();    
            actionContext.Request.Properties[Key] = stopWatch;    
            stopWatch.Start();    
        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)   
        {    
            if (!actionExecutedContext.Request.Properties.ContainsKey(Key))    
            {    
                return;    
            }
            var stopWatch = actionExecutedContext.Request.Properties[Key] as Stopwatch;   
            if (stopWatch != null)    
            {    
                stopWatch.Stop();    
                var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;    
                var controllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;    
                Debug.Print(string.Format("[Execution of{0}- {1} took {2}.]", controllerName, actionName, stopWatch.Elapsed));    
            }
        }
        private static bool SkipLogging(HttpActionContext actionContext)   
        {    
            return actionContext.ActionDescriptor.GetCustomAttributes<NoLogAttribute>().Any() ||    
                    actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<NoLogAttribute>().Any();    
        }
    }
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true)]   
    public class NoLogAttribute : Attribute    
    {
    }   
}

然后在代码里注册 GlobalConfiguration.Configuration.Filters.Add(new TimingActionFilter());

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DOTNET

ASP.NET MVC编程——单元测试

1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试。 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法。 单元测试要满...

5325
来自专栏逆向技术

64位内核第二讲,进程保护之对象钩子

         64位内核第二讲,进程保护. 一丶什么是保护. 什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内...

3476
来自专栏MasiMaro 的技术博文

hook键盘驱动中的分发函数实现键盘输入数据的拦截

我自己在看《寒江独钓》这本书的时候,书中除了给出了利用过滤的方式来拦截键盘数据之外,也提到了另外一种方法,就是hook键盘分发函数,将它替换成我们自己的,然后再...

1042
来自专栏每日一篇技术文章

Foundation-NSLocale

localizedStringForKey("name", defaultValue: "xj",bundleName:"bundle")

591
来自专栏FreeBuf

scapy在wlan中的应用

Scapy 又是scapy,这是python的一个网络编程方面的库,它在wlan中也有很强大的应用。一般我们买块网卡,然后aircrack-ng套件爆破一下邻居...

35410
来自专栏草根专栏

使用xUnit为.net core程序进行单元测试(下1)

第1部分: https://cloud.tencent.com/developer/article/1019835

3826
来自专栏hotqin888的专栏

engineercms利用pdf.js制作连续看图功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1821
来自专栏ASP.NETCore

MVVM绑定多层级数据到TreeView并设置项目展开

昨天在做项目的时候碰到了这个问题,发现通常我们定义的数据不法绑定到控件上,接下来我将讲一下我是怎么解决这个问题的。

1392
来自专栏函数式编程语言及工具

Akka(43): Http:SSE-Server Sent Event - 服务端主推消息

   因为我了解Akka-http的主要目的不是为了有关Web-Server的编程,而是想实现一套系统集成的api,所以也需要考虑由服务端主动向客户端发送指令的...

2709
来自专栏青青天空树

趣味题:恺撒Caesar密码(c++实现)

描述:Julius Caesar 生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是Caesar 军团中的一名军官,需要把Ca...

812

扫码关注云+社区

领取腾讯云代金券