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

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

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

下面是详细代码:ide

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__";spa

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (SkipLogging(actionContext))
            {
                return;
            }
            var stopWatch = new Stopwatch();
            actionContext.Request.Properties[Key] = stopWatch;
            stopWatch.Start();
        }pwa

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (!actionExecutedContext.Request.Properties.ContainsKey(Key))
            {
                return;
            }orm

            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));
            }接口

        }ip

        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());

相关文章
相关标签/搜索