使用 WCF 服务在客户端之间共享信息
Using a WCF service to share information across clients
我正在尝试开发一个系统,以在具有不同更新循环的 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
方法时数据似乎是空的。
我环顾四周但没有找到解决此问题的方法,是否有解决此问题的方法?还是我应该改变我的方法?我想过使用本地数据库,但我不确定这是解决问题的最佳方法
非常感谢
您有多个服务实例 class。如果你想把你的数据放在内存中,你需要 运行 在单实例模式下:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
无论如何,现在将数据保存在内存中可能不是最佳选择。您应该寻找某种数据存储,然后使 that 存储具有单一接口的持久实例。那么不管你的服务实例被使用了多少。
如果您的 WCF 服务将信息存储在数据库中,则存储在一个请求中的信息将进入数据库,而当另一个请求检索它时,结果将来自该数据库。因此,如果一个客户端存储了一些东西,另一个客户端就可以检索它。
这不起作用的原因是,为了响应每个请求,您的应用程序正在创建 TEST_Service
class 的新实例。这意味着 TEST_string
,您在请求之间存储值的地方,是一个新的 string
。它不包含以前的值。
为了实验,您可以尝试将字符串更改为 static
:
static string TEST_string;
...然后该值将在服务 class 的实例之间持续存在。但这仍然不会有效,因为您的 WCF 服务可以部署到多个服务器,然后每个服务器都会有一个单独的 class 实例。更新一个不会更新其他的。或者,如果服务应用程序重新启动,则该值将丢失。 (根据上下文,我假设您只是在试验这个。)
所以最终你会想要一些方法来持久化不依赖于任何这些因素的数据,但 "survive" 即使服务实例 class 超出范围或应用程序关闭。
我正在尝试开发一个系统,以在具有不同更新循环的 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
方法时数据似乎是空的。
我环顾四周但没有找到解决此问题的方法,是否有解决此问题的方法?还是我应该改变我的方法?我想过使用本地数据库,但我不确定这是解决问题的最佳方法
非常感谢
您有多个服务实例 class。如果你想把你的数据放在内存中,你需要 运行 在单实例模式下:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
无论如何,现在将数据保存在内存中可能不是最佳选择。您应该寻找某种数据存储,然后使 that 存储具有单一接口的持久实例。那么不管你的服务实例被使用了多少。
如果您的 WCF 服务将信息存储在数据库中,则存储在一个请求中的信息将进入数据库,而当另一个请求检索它时,结果将来自该数据库。因此,如果一个客户端存储了一些东西,另一个客户端就可以检索它。
这不起作用的原因是,为了响应每个请求,您的应用程序正在创建 TEST_Service
class 的新实例。这意味着 TEST_string
,您在请求之间存储值的地方,是一个新的 string
。它不包含以前的值。
为了实验,您可以尝试将字符串更改为 static
:
static string TEST_string;
...然后该值将在服务 class 的实例之间持续存在。但这仍然不会有效,因为您的 WCF 服务可以部署到多个服务器,然后每个服务器都会有一个单独的 class 实例。更新一个不会更新其他的。或者,如果服务应用程序重新启动,则该值将丢失。 (根据上下文,我假设您只是在试验这个。)
所以最终你会想要一些方法来持久化不依赖于任何这些因素的数据,但 "survive" 即使服务实例 class 超出范围或应用程序关闭。