C# Web服务中的数据持久性?

C# Web服务中的数据持久性?,c#,.net,web-services,C#,.net,Web Services,在.NET Web服务中,数据持久性的解决方案是什么 我有一个网络服务。我给我的Web服务一个id,这个id返回正确的对象 [OperationContract] [WebInvoke(Method = "GET", UriTemplate = "/GetMyObject?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

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

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

        [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;
        }
}
公共类服务:iSeries
{
列表=新列表();
公共服务()
{
Add(新的MyObject(){Id=1,Data=…});
Add(新的MyObject(){Id=2,Data=…});
Add(新的MyObject(){Id=3,Data=…});
添加(新的MyObject(){Id=4,Data=…})
...
}
公共MyObject GetMyObject(字符串id)
{
//从列表中获取我的对象的代码
返回myObject;
}
}

它可以工作,但是每次我调用我的webservice时都会调用构造函数,我想初始化这个列表一次,以后再对它进行修改。如何初始化列表并将其持久化?

您可以使用静态集合:

private static List<MyObject> list = new List<MyObjec>();
private static List=new List();
当然,由于这是一个多线程应用程序,您可能会同时访问此集合,因此必须确保同步对它的访问。或者,如果您正在使用.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已经内置

如果执行此操作,则不应再使用
List
,因为如果同时调用两次web方法,则会得到损坏的数据。@oleksii此解决方案是否适用于将一直被调用的web服务?每一毫秒都有许多计算机?@DarinDimitrov是的,你是对的,我为此添加了
ConcurrencyMode.Single
。或者,Dran可以根据您的答案使用
ConcurrantBag
。@Dran此解决方案用于快速测试。我不会在高性能的应用程序中使用它。当我启动我的webservice项目时,我如何初始化我的列表一次?你可以为web服务类使用一个,CLR保证每个AppDomain生命周期只调用一次。现在我不介意Concurrency,但在最终解决方案中,我必须使用其他方法我不确定Web服务中数据持久性的定义。如果必须重新启动服务和服务器,清除所有内存,是否需要数据保持持久性?
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
                 ConcurrencyMode = ConcurrencyMode.Single)]
class Service
...