Web服务中的数据持久性?

时间:2012-06-27 16:31:04

标签: c# .net web-services

.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都会调用构造函数,我想初始化一次这个列表并稍后对它进行修改。我应该如何初始化我的列表并坚持下去?

3 个答案:

答案 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