Использование службы WCF для обмена информацией между клиентами - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь разработать систему для обмена информацией между двумя приложениями 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 в другом, данные оказываются пустыми.

Я осмотрелся, но не нашел решения этой проблемы, есть ли способ обойти это?или я должен изменить свой подход?Я думал об использовании локальной базы данных, но я не уверен, что это лучший способ ее решить

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Если ваша служба WCF хранит информацию в базе данных, то информация, хранящаяся по одному запросу, будет отправлена ​​в базу данных, а когда другой запрос получит ее, результат будет получен из этой базы данных. Так что, если один клиент что-то сохранил, другой мог бы его извлечь.

Причина, по которой это не работает, заключается в том, что в ответ на каждый запрос ваше приложение создает новый экземпляр класса TEST_Service. Это означает, что TEST_string, где вы храните значения между запросами, является новым string. Не содержит предыдущего значения.

Для экспериментов вы можете попробовать изменить строку на static:

static string TEST_string;

... и тогда значение будет сохраняться между экземплярами класса обслуживания. Но это все равно не будет эффективным, потому что ваша служба WCF может быть развернута на нескольких серверах, и тогда у каждого будет отдельный экземпляр класса. Обновление одного не обновит другие. Или, если приложение-служба перезапустится, значение будет потеряно. (Из контекста я предполагаю, что вы просто экспериментируете с этим.)

Таким образом, в конечном итоге вы захотите сохранить данные, которые не будут зависеть ни от одного из этих факторов, но будут «выживать», даже когда экземпляр класса обслуживания выйдет из области видимости или приложение закроется.

0 голосов
/ 07 мая 2019

У вас есть более одного экземпляра вашего класса обслуживания.Если вы хотите, чтобы ваши данные были в памяти, вам нужно будет запустить их в режиме одного экземпляра:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

Теперь сохранение ваших данных в памяти может быть не лучшим вариантом в любом случае.Вам нужно найти какое-то хранилище данных и затем сделать , чтобы сохранял постоянный экземпляр с одним интерфейсом.Тогда не имеет значения, сколько ваших экземпляров службы используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...