将列表存储在所有用户均可访问的内存中

时间:2017-01-11 11:42:20

标签: c# asp.net asp.net-web-api

所以我想在内存中保留一个列表,使用get和post方法。

所有用户都必须能够在相同列表中发布和阅读。我已经调查了

HttpContext.Current.Session

对于控制器,但它只在单个用户的内存中保留相同的列表。

那么如何实现所有用户都可以访问的List?

我的项目是WebAPI,因此Rest必须能够轻松访问。

2 个答案:

答案 0 :(得分:4)

您可以使用HttpContext.Current.Application代替所有用户共享的内容:

HttpContext.Current.Application["someList"] = new List<string> { "a", "b" };

然后像这样检索:

var myList = HttpContext.Current.Application["someList"] as List<string>;

作为替代方案,您可以使用静态属性:

public static class MyHelper
{
   static MyHelper()
   {
       MyList = new List<string>();
   }

    public static IList<string> MyList { get; set; }
}

然后你就可以这样使用:

MyHelper.MyList = new List<string> { "a", "b" };

并检索值:

IList<string> myList = MyHelper.MyList;

这就是说,请注意,如果您在Web场中运行,则可能需要考虑一些分布式缓存,因为HttpContext.Current.Application将存储在当前Web节点的内存中。

关于这一点的另一个重要注意事项是List<T>类不是线程安全的,因此在不同线程之间共享单个实例可能会导致数据损坏,除非您通过使用正确地同步读取器和编写器之间对此列表的访问相应的锁定机制或使用ConcurrentBag<T>而不是设计为线程安全的。

答案 1 :(得分:0)

正如Darin指出的那样,您可以使用HttpContext.Current.Application来存储服务器上所有应用程序实例必须可用的值。但是,您必须确保以线程安全的方式进行任何更新,以便多个实例(即请求处理程序)无法同时更新相同的值。

如果您在Web场上运行应用程序,那么使用多个Web服务器来处理更多用户,这不是一个好的选择,因为Application状态在每台服务器上都是本地的。在这种情况下,最好将共享状态存储在数据库中或分布式缓存中,例如Redis(请参阅https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed)。