2

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

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

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

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

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

4

3 回答 3

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

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

于 2012-06-27T16:33:40.733 回答
3

或者,您可以将您的服务设为单例

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

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

于 2012-06-27T16:36:18.327 回答
0

WCF 已内置实例管理

于 2012-06-27T16:36:24.723 回答