使用 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 客户端。

我测试了 GetDataStoreData 函数,它们可以独立工作,但是当我在一个应用程序上使用 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 超出范围或应用程序关闭。