Skip to main content
 首页 » 编程设计

c#之如何获取 .NET WebAPI 调用的运行时间

2024年01月21日26mayingbao

如何在 C# 中获取 .NET WebAPI 调用的运行时间?

我的日志文件需要这样的信息

我可以很容易地在 API 调用之前和之后执行 DateTime.Now(),但是,如果已经有一些东西...让我们使用它吧!

请您参考如下方法:

你可以使用过滤器

using System; 
using System.Diagnostics; 
using System.Net.Http; 
using System.Web.Http.Controllers; 
using System.Web.Http.Filters; 
using System.Web.Mvc; 
 
namespace App.Utility 
{ 
    /// <summary> 
    /// Used to log requests to server 
    /// </summary> 
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
    public class LogActionRequestsAttribute : ActionFilterAttribute 
    { 
        public LogActionRequestsAttribute() 
        { 
             //You can inject to constructors ILog or what ever 
        } 
 
        public static Stopwatch GetTimer(HttpRequestMessage request) 
        { 
            const string key = "__timer__"; 
            if (request.Properties.ContainsKey(key)) 
            { 
                return (Stopwatch)request.Properties[key]; 
            } 
 
            var result = new Stopwatch(); 
            request.Properties[key] = result; 
            return result; 
        } 
         
        public override void OnActionExecuting(HttpActionContext actionContext) 
        { 
             
            var timer = GetTimer(actionContext.Request); 
            timer.Start(); 
            base.OnActionExecuting(actionContext); 
        } 
 
 
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
        { 
            base.OnActionExecuted(actionExecutedContext); 
            var timer = GetTimer(actionExecutedContext.Request); 
            timer.Stop(); 
            var totalTime = timer.ElapsedMilliseconds;             
        } 
    } 
} 

然后在webapi配置中

config.Filters.Add( 
                (LogActionRequestsAttribute) 
                    GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof (LogActionRequestsAttribute))); 

AttributeUsage 防止调用属性两次。 但我认为其他选择可能是编写 http 模块以使用开始、结束请求事件,这可能是最好和精确的测量,在我的应用程序中它足以使用属性,因为几毫秒对我​​来说没什么大不了的