Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将列表存储在所有用户都可以访问的内存中_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# 将列表存储在所有用户都可以访问的内存中

C# 将列表存储在所有用户都可以访问的内存中,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,所以我想在内存中保留一个列表,使用get和post方法 所有用户必须能够发布和阅读相同的列表。我已经调查过了 HttpContext.Current.Session 对于控制器,但它仅在内存中为单个用户保留相同的列表 那么,我如何实现一个所有用户都可以访问的列表呢 我的项目是WebAPI,因此Rest必须能够轻松访问它。您可以使用HttpContext.Current.Application,它将在所有用户之间共享: HttpContext.Current.Application["someL

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

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

HttpContext.Current.Session
对于控制器,但它仅在内存中为单个用户保留相同的列表

那么,我如何实现一个所有用户都可以访问的列表呢


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

您可以使用
HttpContext.Current.Application
,它将在所有用户之间共享:

HttpContext.Current.Application["someList"] = new List<string> { "a", "b" };
HttpContext.Current.Application[“someList”]=新列表{“a”,“b”};
然后像这样检索:

var myList = HttpContext.Current.Application["someList"] as List<string>;
MyHelper.MyList = new List<string> { "a", "b" };
var myList=HttpContext.Current.Application[“someList”]作为列表;
也可以使用静态属性:

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

    public static IList<string> MyList { get; set; }
}
公共静态类MyHelper
{
静态MyHelper()
{
MyList=新列表();
}
公共静态IList MyList{get;set;}
}
然后你可以这样使用:

var myList = HttpContext.Current.Application["someList"] as List<string>;
MyHelper.MyList = new List<string> { "a", "b" };
MyHelper.MyList=新列表{“a”,“b”};
并检索该值:

IList<string> myList = MyHelper.MyList;
IList myList=MyHelper.myList;

这是说,请注意,如果你在一个Web站点中运行,你可能需要考虑一些分布式缓存,因为<代码> HTTPixValue.Neal.Apdio/<代码>将被存储在当前Web节点的内存中。


关于这一点的另一个重要注意事项是,
List
类不是线程安全的,因此在不同线程之间共享单个实例可能会导致数据损坏,除非您使用相应的锁定机制或使用
ConcurrentBag
相反,它被设计为线程安全。

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


如果您在一个Web服务器场上运行应用程序,那么使用多个Web服务器来处理更多用户,这不是一个好的选择,因为
application
状态在每台服务器上都是本地的。在这种情况下,最好将共享状态存储在数据库或分布式缓存(如Redis)中(请参阅)。

是否有不能使用数据库的原因?这是做这类事情的正常方式。不,我希望它存储在缓存/内存中。并且存储在其中的数据将非常频繁地更改。列表应该每12小时休息一次。你可以做一些事情,尽管你需要非常小心多人访问列表,就像Alex提到的那样,你应该使用数据库或某种存储。如果您出于某些测试目的需要此功能,那么维护静态列表可能会有所帮助,但请注意,当应用程序域重新加载/回收时,该列表中的数据将被清除。或者你也可以使用缓存来实现这一点,类似的东西是一个不错的选择。使用ConcurrentBag而不是列表不是更好,否则多人从列表中添加/删除会导致问题。是的,这是一个很好的观点。我将在我的回答中添加一条关于线程安全的注释。因此,即使我不初始化列表,但调用
IList myList=MyHelper.myList
它也不会出现任何空异常。非常方便。所以我不必初始化列表?我可以调用MyHelper.MyList.Add(“string”),它就可以工作了?是的,列表已经在静态构造函数中初始化了。