Web服务中的数据持久性?

.NET Web服务中数据持久性的解决方案是什么?

我有一个网络服务。 我给我的webservice一个id,这个返回正确的对象。

[OperationContract] [WebInvoke(Method = "GET", UriTemplate = "/GetMyObject?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] MyObject GetMyObject(string id); 

我不想使用数据库。 我想将我的对象集合保存在“内存”中。 所以我决定在我的webservice中创建一个简单的对象

  public class Service : IService { List list = new List(); public Service() { list.Add(new MyObject() { Id = 1, Data = ...} ); list.Add(new MyObject() { Id = 2, Data = ...} ); list.Add(new MyObject() { Id = 3, Data = ...} ); list.Add(new MyObject() { Id = 4, Data = ...} ) ... } public MyObject GetMyObject(string id) { // code to get my object from the list return myObject; } } 

它工作,但每次调用我的webservice时都会调用构造函数,我想初始化此列表一次并稍后对其进行修改。 我该如何初始化我的列表并坚持下去?

您可以使用静态集合:

 private static List list = new List(); 

当然,由于这是一个multithreading应用程序,您可能可以同时访问此集合,因此必须确保同步对该集合的访问。 或者,如果您使用的是.NET 4.0,只需使用线程安全的ConcurrentBag

 private static ConcurrentBag list = new ConcurrentBag(); 

当然,您应该完全清楚,通过使用内存结构来存储数据,您的数据生命基本上与Web应用程序的生命周期紧密相关。 而且由于IIS可以随时回收应用程序域(一段时间不活动,达到某些CPU /内存阈值),所有存储在内存中的内容都会进入虚空状态。

顺便说一下,如果你走这条路,每次重新编译你的web服务时都要经常做好准备,因为重新编译你基本上是在bin文件夹中修改程序集,而web服务器只是简单地回收应用程序。

所以是的,所有这些文本墙告诉你在内存以外的地方保存你的数据:-)你有很多可能,包括不同格式的文件,数据库,嵌入式数据库,……

或者,您可以使您的服务成为单身人士

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)] class Service ... 

但是,这种方法将来会导致巨大的问题。 不要在内存中存储任何内容。 如果这样做,则将状态嵌入到应用程序中。 这导致实现高可靠性和可扩展性所需的大量工作。 没有状态,没有痛苦。

WCF内置了实例管理 。