WCF serviceType как одноэлементный экземпляр - PullRequest
0 голосов
/ 13 июля 2009

Я создал службу Windows Communication Foundation (в данном случае appDomain - это приложение Windows Forms), которая инициализирует свой класс serviceType как одиночный:

Запуск службы работает. Звонок от клиента работает. Но если служба выполняет вызов для себя с указанным выше кодом («// Сделать первый вызов службе?»), Я получаю исключение System.TimeoutException.

private static myDataService.DataProvider.CustomSingletonClass obs;

public DataProviderServiceType()
{

    //Create the object if needed.  This should only be required first time.
    if (obs == null)
    {
        obs = new myDataService.DataProvider.CustomSingletonClass();
        //Instruct the class to read its configuration and initialize.                       

        obs.initializeSingletonClass(null);

    }

}

Одиночный класс имеет объект таймера, который запускается при его инициализации. Таким образом, как только клиент делает вызов, выполняется служба, создается экземпляр класса, запускается таймер, и объект будет продолжать свое существование с периодически запускаемым объектом таймера.

Для контекста, событие таймера обновит свойства синглтона. Цель состоит в том, чтобы одноэлементный класс периодически выполнял вычисления, сохранял данные в своих свойствах и возвращал все, что в свойствах, вызывающему клиенту. Таким образом, вызовы для выполнения периодических (основанных на времени) вычислений ограничены, и все клиенты получают одинаковые обновленные данные.

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

SetListText("Starting Service...");
host_DataService = new ServiceHost(serviceType_Data);
host_DataService.Open();
SetListText("Service is now available.");

Я бы хотел, чтобы служба инициализировала синглтон-класс одним вызовом, чтобы 1-й клиент, отправивший запрос, не ожидал выполнения конфигурации и инициализации; данные для обновления при запуске программы. Сразу после "SetListText (" Сервис теперь доступен. ");" у меня есть следующее:

//Make the 1st call to the service?
EndpointAddress endpointAddress = new     EndpointAddress("http://localhost:8000/myDataService/DataProvider/TimedCalculator");
BasicHttpBinding serviceBinding = new BasicHttpBinding();

serviceBinding.CloseTimeout = new TimeSpan(0, 1, 0);
serviceBinding.OpenTimeout = new TimeSpan(0, 1, 0);
serviceBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
serviceBinding.SendTimeout = new TimeSpan(0, 1, 0);

DataProviderClient client = new DataProviderClient (serviceBinding, endpointAddress);
String[][] ArrStr = client.retrieveList();

Есть ли способ сделать так, чтобы служба WCF выполняла вызов к себе в том же домене приложения, или это разумно нежелательно? Есть ли причины отказаться от этого кода для самостоятельного вызова и просто жить с сервисным вызовом 1-го клиента?

1 Ответ

1 голос
/ 13 июля 2009

Я бы сделал это немного по-другому. Попробуйте это:

  • Отбросить с помощью одноэтапной службы WCF
  • Использование Enterprise Library для кэширования
  • В вашей службе WCF проверьте, достаточно ли новые данные в кеше, если да, верните их, если нет, получите / пересчитайте данные.
  • Создание службы Windows, которая опрашивает службу WCF через определенные промежутки времени.

Если временные интервалы достаточно короткие, обычно служба Windows выполняет работу по восстановлению.

Существуют также варианты этого паттерна:

  • Служба Windows вызывает службу данных кеширования
  • Вместо службы Windows вы используете кеширующий прокси-продукт
...