Asp.net web api ASP.NETWebAPI操作执行时间

Asp.net web api ASP.NETWebAPI操作执行时间,asp.net-web-api,Asp.net Web Api,我有几种web api操作方法,我希望捕获它们的执行开始时间和结束时间。我认为使用ActionFilter的OnActionExecuting和OnActionExecuted方法可以从集中的位置捕获它。其思想是捕获执行开始时间并将其添加到ActionExecuting方法中的响应头中。类似地,在OnActionExecuted方法中捕获执行结束时间并将其发送到响应头。 现在这里的问题是“OnActionExecuting”方法,它只是请求处理的开始,响应对象并没有初始化,我不能添加响应头。 为

我有几种web api操作方法,我希望捕获它们的执行开始时间和结束时间。我认为使用ActionFilter的OnActionExecuting和OnActionExecuted方法可以从集中的位置捕获它。其思想是捕获执行开始时间并将其添加到ActionExecuting方法中的响应头中。类似地,在OnActionExecuted方法中捕获执行结束时间并将其发送到响应头。 现在这里的问题是“OnActionExecuting”方法,它只是请求处理的开始,响应对象并没有初始化,我不能添加响应头。 为什么要使用标题进行此操作: 在生产中,我将使用请求头发送标志,以在需要时捕获执行时间,而在其他时间它不会捕获这些细节。 我不想使用日志记录方法,而是使用http头。我也不想在单独的操作方法中编写此代码。 是否有任何地方可以将执行开始时间存储在某个地方,并在OnActionExecuted方法中访问它并将其添加到响应头? 我使用了以下代码,但在OnActionExecuting响应对象中为NULL

public class TestFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        //Response is not initialized yet. Hence this wont work.  
        actionContext.Response.Headers.Add("StartTime", DateTime.Now.ToLongTimeString());
        base.OnActionExecuting(actionContext);
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        actionExecutedContext.Response.Headers.Add("StartTime", DateTime.Now.ToLongTimeString());
        base.OnActionExecuted(actionExecutedContext);
    }
}

我找到了存储请求开始时间的方法。在OnActionExecuting方法中,我捕获开始时间并将其作为自定义属性存储在actionContext.Request.Properties上。我正在OnActionExecuted方法中检索这个存储值,并在响应头上设置它。我认为这可能对寻求类似实现的人有所帮助。

您是否只对操作执行时间而不是整个web api管道执行时间感兴趣?使用
ActionFilter
将仅跟踪控制器操作方法的执行时间,并排除任何其他处理。如果您想包含整个管道,那么最好将
DelegatingHandler
作为MessageHandlers集合中的第一项。谢谢Casey。我还将探讨DelegatingHandler方法。