.NET Web服务中数据持久性的解决方案是什么?
我有一个网络服务。我给我的webservice一个id,这个返回正确的objet。
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/GetMyObject?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
MyObject GetMyObject(string id);
我不想使用数据库。我想把我的对象集合保存在“记忆”中。所以我决定在我的webservice中创建一个简单的对象,就像这样
public class Service : IService
{
List<MyObject> list = new List<MyObjec>();
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都会调用构造函数,我想初始化一次这个列表并稍后对它进行修改。我应该如何初始化我的列表并坚持下去?
答案 0 :(得分:8)
您可以使用静态集合:
private static List<MyObject> list = new List<MyObjec>();
当然,由于这是一个多线程应用程序,您可能可以同时访问此集合,因此必须确保同步对该集合的访问。或者,如果您使用的是.NET 4.0,只需使用线程安全ConcurrentBag<T>
:
private static ConcurrentBag<MyObject> list = new ConcurrentBag<MyObjec>();
当然,您应该完全清楚,通过使用内存结构来存储数据,您的数据生命基本上与Web应用程序的生命周期紧密相关。而且由于IIS可以随时回收应用程序域(一段时间不活动,达到某些CPU /内存阈值),所有存储在内存中的内容都会进入虚空状态。
顺便说一句,如果你走这条路,每次重新编译你的web服务时都要经常做好准备,因为通过重新编译,你基本上是在bin文件夹中修改程序集,而web服务器只会回收应用程序
所以是的,所有这些文本墙告诉你在内存以外的地方保存你的数据:-)你有很多可能,包括不同格式的文件,数据库,嵌入式数据库...... / p>
答案 1 :(得分:3)
或者,您可以将服务设为单身
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Single)]
class Service
...
然而,这种方法将来会导致巨大的问题。不要在内存中存储任何内容。如果这样做,则将状态嵌入到应用程序中。这导致实现高可靠性和可扩展性所需的大量工作。没有状态,没有痛苦。
答案 2 :(得分:0)
WCF已内置instance management。