gpt4 book ai didi

c# - ActionFilterAttribute 是否为每个 Action 实例化?

转载 作者:行者123 更新时间:2023-12-04 02:39:07 24 4
gpt4 key购买 nike

我想在 ActionFilterAttribute 中有一个字段,它只与它所在的操作相关,例如

    public class TimedAction : ActionFilterAttribute
{
long start, end;

public override void OnActionExecuting(HttpActionContext actionContext)
{
start = Stopwatch.GetTimestamp();

base.OnActionExecuting(actionContext);
}

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);

end = Stopwatch.GetTimestamp();
}
}

假设 TimedAction 将为每个 API 调用操作实例化是否安全?

编辑:我将代码更改为此,现在看来请求是共享的(什么??),当我尝试添加键值对时出现异常:已添加具有相同键的项目。

        public override void OnActionExecuting(HttpActionContext context)
{
var start = Stopwatch.GetTimestamp();

context.Request.Properties.Add(new KeyValuePair<string, object>("Stopwatch", start));

base.OnActionExecuting(context);
}

public override void OnActionExecuted(HttpActionExecutedContext context)
{
base.OnActionExecuted(context);

var end = Stopwatch.GetTimestamp();

object o;
long start = 0;
if (context.Request.Properties.TryGetValue("Stopwatch", out o))
{
start = (long)o;
}
}

最佳答案

不要那样做,因为属性是静态定义的。您需要将其存储在请求中,例如 HttpContext.Current.Items["SomeKey"]:

public override void OnActionExecuting(HttpActionContext actionContext)
{
HttpContext.Current.Items["Now"] = DateTime.UtcNow;

base.OnActionExecuting(actionContext);
}

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var beginning = (DateTime) HttpContext.Current.Items["Now"];

var end = DateTime.UtcNow;

var interval = end - beginning;

base.OnActionExecuted(actionExecutedContext);
}

关于c# - ActionFilterAttribute 是否为每个 Action 实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60211723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com