在Web服务上保存对象状态

时间:2011-04-14 09:22:32

标签: .net wcf web-services

几天以来,我正在寻找一个解答我问题的答案,而且我已经离开了轨道。所以我在这里问我的问题,也许有人会有一个想法。

我使用许多方法创建了一个WCF Web服务。我希望在调用第一个方法时在webservice上的对象中保存一些数据,并在客户端调用第二个方法时重用它们。

例如:

public class Toto : IToto
{
        private List<Hardware> hwList = new List<Hardware>();

        public void addHardware(Hardware hw) {
                hwList.Add(hw);
        }

        public void getHardwareList(out List<Hardware> list)
        {
                list = hwList;
        }
}

我想,当我调用addHardware方法时,列表会将我放入其中的所有硬件对象保留在内存中。然后,当我调用getHardwareList时,检索之前放在列表中的所有Hardward对象。

问题是,每次调用后,我的列表都会重新初始化,并且为空。

我在InstanceContextMode中找到了很多关于“PerSession”的信息,但它不起作用。当我强制ServiceContract为SessionMode.Required时,basicHttpBinding会出现很多麻烦。我试图将其更改为wsHttpbinding但没有成功。

我的最后一个问题是:是否可以保存我的列表实例而不将其状态保存在数据库中,而不是在XML请求/答案中将其序列化。

在客户端上创建的每个Web服务实例都有自己的列表并不重要,因为这就是我想要的。因此,webservice的第一个实例将具有其列表实例,而第二个实例将具有该列表的另一个实例。

任何人都可以帮助我?

非常感谢!

2 个答案:

答案 0 :(得分:0)

您是要为每个客户端还是按服务使用列表?如果答案是每个客户端,那么您需要一些支持WCF会话的绑定(BasicHttpBinding不可能)或者您必须降级WCF服务以使用ASP.NET会话(通过使用AspNetCompatibility)或者您必须添加自己的机制。如果答案是每个服务(所有客户端将访问相同的列表),您应该使用InstanceContextMode.Single并处理方法中的同步(一个客户端可以在其他客户端想要读取列表的同时将HW添加到列表中)。

答案 1 :(得分:0)

如果您的对象对所有用户都是全局的,您可以使用静态属性或单例模式将对象保存在内存中,只需确保处理同步问题。

如果您的对象是用户绑定的并且您想避免使用会话,则需要构建一个全局字典以在用户与其对象之间进行映射。

如果您使用的是Web园或群集服务器,则在这两种情况下都存在扩展问题。

干杯,

吉拉德