几天以来,我正在寻找一个解答我问题的答案,而且我已经离开了轨道。所以我在这里问我的问题,也许有人会有一个想法。
我使用许多方法创建了一个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的第一个实例将具有其列表实例,而第二个实例将具有该列表的另一个实例。
任何人都可以帮助我?
非常感谢!
答案 0 :(得分:0)
您是要为每个客户端还是按服务使用列表?如果答案是每个客户端,那么您需要一些支持WCF会话的绑定(BasicHttpBinding
不可能)或者您必须降级WCF服务以使用ASP.NET会话(通过使用AspNetCompatibility)或者您必须添加自己的机制。如果答案是每个服务(所有客户端将访问相同的列表),您应该使用InstanceContextMode.Single
并处理方法中的同步(一个客户端可以在其他客户端想要读取列表的同时将HW添加到列表中)。
答案 1 :(得分:0)
如果您的对象对所有用户都是全局的,您可以使用静态属性或单例模式将对象保存在内存中,只需确保处理同步问题。
如果您的对象是用户绑定的并且您想避免使用会话,则需要构建一个全局字典以在用户与其对象之间进行映射。
如果您使用的是Web园或群集服务器,则在这两种情况下都存在扩展问题。
干杯,
吉拉德