我有几个web api动作方法,我想捕获执行开始时间和结束时间。我想使用ActionFilter的OnActionExecuting和OnActionExecuted方法我可以从集中的地方捕获它。想法是捕获执行开始时间并将其添加到响应头部OnActionExecuting方法。类似地捕获执行结束时间,并将其捕获到OnActionExecuted方法中的响应头。 现在问题在于" OnActionExecuting"它刚刚启动请求处理和响应对象没有初始化,我无法添加响应头。 为什么我要使用标题来做它: 在生产中,我将使用请求标头发送标志以在需要时捕获执行时间,而在其他时间它不会捕获这些细节。 我不想使用日志记录方法,而是使用http标头。我也不想在个别行动方法中编写此代码。 有没有我可以在某处存储执行开始时间的地方,我在OnActionExecuted方法中访问它并将其添加到响应头? 我使用了以下代码,但在OnActionExecuting中,Response对象为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);
}
}
答案 0 :(得分:2)
我找到了存储请求开始时间的方法。在OnActionExecuting方法中,我捕获开始时间并将其作为自定义属性存储在actionContext.Request.Properties上。我在OnActionExecuted方法中检索的存储值,并将其设置在Response标头上。认为对于正在寻找类似实现的人来说可能会有所帮助。