如何在不降低性能的情况下使所有webapi请求都可以使用昂贵的方法数据?
本文关键字:可以使 请求 数据 方法 webapi 性能 情况下 | 更新日期: 2023-09-27 18:13:07
我有一些数据需要在我的WebApi控制器方法被调用时惰性访问(数据由GetModelRelationalInformation()方法处理,并且可能是一个昂贵的操作,一旦创建存在于服务的生命周期中,服务的其余部分非常快,但由于传入其他参数,结果不能被缓存)。我想避免使用完整的缓存库或单例库,所以我认为利用应用程序变量将是前进的方向:
if (HttpContext.Current.Application["ModelRelationalInfo"] == null)
{
HttpContext.Current.Applicatin["ModelRelationalInfo"] = GetModelRelationalInformation();
}
return HttpContext.Current.Applicatin["ModelRelationalInfo"];
但是,如果在构建数据之前出现第二个请求,我不希望再次运行昂贵的方法,因此我考虑在此周围添加锁,如下所示:
if (HttpContext.Current.Application["ModelRelationalInfo"] == null)
{
lock (padlock)
{
if (HttpContext.Current.Application["ModelRelationalInfo"] == null)
{
HttpContext.Current.Applicatin["ModelRelationalInfo"] = GetModelRelationalInformation();
}
}
}
return HttpContext.Current.Applicatin["ModelRelationalInfo"];
我知道锁是昂贵的,但这应该只影响对服务的初始请求(那些在构建数据时进入的请求)。以这种方式访问应用程序变量安全吗?我们是否应该考虑其他方法,比如单例更合适?
这是一个更大的服务的一部分,所以把它放到全局。asax会增加服务的启动时间,这也是我想避免的。
编辑:请注意,padlock是一个类成员静态变量,与此代码中的方法相同。
我更喜欢使用缓存机制。看一下System.Web.Caching。
对于您的问题,您也可以使用Lazy<>类。这是这类操作的推荐方法