如何在不降低性能的情况下使所有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是一个类成员静态变量,与此代码中的方法相同。

如何在不降低性能的情况下使所有webapi请求都可以使用昂贵的方法数据?

我更喜欢使用缓存机制。看一下System.Web.Caching。

对于您的问题,您也可以使用Lazy<>类。这是这类操作的推荐方法

相关文章: