使用WCF服务在客户端之间共享信息

时间:2019-05-07 13:50:57

标签: c# wcf

我正在尝试开发一个系统,以便在具有不同更新循环的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方法时似乎是空的。

我环顾四周,但尚未找到解决该问题的方法,是否可以解决此问题?还是应该改变方法?我曾考虑使用本地数据库,但不确定这是否是解决该问题的最佳方法

非常感谢

2 个答案:

答案 0 :(得分:0)

您有一个以上的服务类实例。如果要将数据存储在内存中,则需要在单实例模式下运行它:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

现在将数据保存在内存中可能不是最佳选择。您应该寻找某种类型的数据存储,然后使存储具有单个接口的持久性实例。那么使用多少服务实例都没有关系。

答案 1 :(得分:0)

如果WCF服务将信息存储在数据库中,则存储在一个请求中的信息将进入数据库,而当另一个请求检索到该信息时,结果将来自该数据库。因此,如果一个客户端存储了某些内容,则另一个客户端可以检索它。

之所以不起作用,是因为响应每个请求,您的应用程序正在创建TEST_Service类的新实例。这意味着在请求之间存储值的TEST_string是新的string。它不包含先前的值。

为了进行实验,您可以尝试将字符串更改为static

static string TEST_string;

...,然后该值将在服务类的实例之间保留。但这仍然无效,因为您的WCF服务可以部署到多个服务器,然后每个服务器都有一个单独的类实例。更新一个不会更新其他。或者,如果服务应用程序重新启动,则该值将丢失。 (从上下文来看,我认为您只是在对此进行试验。)

因此,最终,您需要某种方式来保留不依赖于任何这些因素的数据,但是即使服务类的实例超出范围或应用程序关闭,它们也可以“存活”。 >