2012-06-27 137 views
2

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

我有一个web服务。我给我的web服务一个id,这个返回正确的objet。

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

我不想使用数据库。我想将我的对象集合保存在“内存”中。所以我决定在我的web服务创建一个简单的物体,像这样

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; 
     } 
} 

它的工作原理,但构造函数被调用各次我打电话给我的web服务,我想一旦初始化这个名单,后来将它应用修改。我应该如何初始化我的列表并坚持下去?

+0

在这一刻我不介意关于协调性,但是在最终的解决方案中,我将不得不使用除列表之外的其他东西。 –

+0

我不确定Web服务中数据持久性的定义。如果必须重新启动服务和服务器,清除所有内存,您是否需要数据持久存储? –

回答

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服务器将简单地回收应用。

所以,所有这些文字墙告诉你要将数据保存在内存以外的其他地方:-)你有很多可能性,包括不同格式的文件,数据库,嵌入式数据库......

+0

当我启动webservice项目时,如何初始化我的列表? –

+1

您可以对CLR保证的Web服务类使用[静态构造函数](http://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx),以便每个AppDomain生存期仅调用一次。 –

3

或者,你可以让你的服务单身

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

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

+0

如果你这样做,你不应该再使用'List '因为如果你有两个Web方法的并发调用,你会得到损坏的数据。 –

+0

@oleksii这个解决方案的性能是否会一直在调用Web服务?每台电脑有多少毫秒? –

+0

@DarinDimitrov是的你是对的,我为此添加了'ConcurrencyMode.Single'。另外,Dran可以在你的答案中使用'ConcurrantBag '。 – oleksii