我正在尝试开发一个系统,以便在具有不同更新循环的2个Windows应用程序之间共享信息。
我开发了一种使用WCF服务存储和检索数据的解决方案。但是,这些数据在客户端之间是不同的,因此对于每个应用程序显示不同的值。
我尝试实现的服务与此类似
namespace TEST_Service_ServiceLibrary
{
[ServiceContract]
public interface TEST_ServiceInterface
{
[OperationContract]
string GetData();
[OperationContract]
void StoreData(string data);
}
}
namespace TEST_Service_ServiceLibrary
{
// Core service of the application, stores and provides data:
public class TEST_Service : TEST_ServiceInterface
{
string TEST_string;
// Used to pull stored data
public string GetData()
{
return TEST_string;
}
// Used to store data
public void StoreData(string data)
{
TEST_string = data;
}
}
}
每个应用程序都会创建一个TEST_Service客户端。
我测试了GetData
和StoreData
函数,它们独立工作,但是当我在一个应用程序上使用StoreData
并从另一个数据测试GetData
方法时似乎是空的。
我环顾四周,但尚未找到解决该问题的方法,是否可以解决此问题?还是应该改变方法?我曾考虑使用本地数据库,但不确定这是否是解决该问题的最佳方法
非常感谢
答案 0 :(得分:0)
您有一个以上的服务类实例。如果要将数据存储在内存中,则需要在单实例模式下运行它:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
现在将数据保存在内存中可能不是最佳选择。您应该寻找某种类型的数据存储,然后使该存储具有单个接口的持久性实例。那么使用多少服务实例都没有关系。
答案 1 :(得分:0)
如果WCF服务将信息存储在数据库中,则存储在一个请求中的信息将进入数据库,而当另一个请求检索到该信息时,结果将来自该数据库。因此,如果一个客户端存储了某些内容,则另一个客户端可以检索它。
之所以不起作用,是因为响应每个请求,您的应用程序正在创建TEST_Service
类的新实例。这意味着在请求之间存储值的TEST_string
是新的string
。它不包含先前的值。
为了进行实验,您可以尝试将字符串更改为static
:
static string TEST_string;
...,然后该值将在服务类的实例之间保留。但这仍然无效,因为您的WCF服务可以部署到多个服务器,然后每个服务器都有一个单独的类实例。更新一个不会更新其他。或者,如果服务应用程序重新启动,则该值将丢失。 (从上下文来看,我认为您只是在对此进行试验。)
因此,最终,您需要某种方式来保留不依赖于任何这些因素的数据,但是即使服务类的实例超出范围或应用程序关闭,它们也可以“存活”。 >