2009-11-09 3 views
1

Я хотел бы создать службу Windows, которая будет доступна через WCF из веб-приложения. Рабочий процесс будет следующим:.net windows service как государственный сервер

  1. Служба Windows запускает и сохраняет значение по умолчанию в памяти.
  2. Веб-приложение будет подключать службу Windows через wcf и принимать значение и после некоторой обработки установить значение обратно в память.

  3. В то время как бы случилось то же самое, что и в пункте 2., и так далее, так далее

Это значение будет иметь место только в памяти.

Дело в том, что я не знаю, где положить переменную, которая будет храниться в памяти окна службы. Существует класс службы, который может быть установлен в классе программы, который является статическим классом. Итак, что лучше всего разместить переменную, которая будет храниться в памяти при условии, что служба запущена?

И второй вопрос, правильно ли ссылаться на exe из службы windows в DLL?

ответ

1

Для каждой службы Windows существует класс обслуживания, который также содержит методы запуска и остановки. Однако для вашей службы я просто создаю одноэлементный класс, доступ к которому осуществляется из класса, который обрабатывает запросы клиента WCF.

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

Предлагаю: Конструируйте операции и контракты на данные для службы, а затем создайте ссылку на обслуживание в рамках своего проекта клиента. Это прояснит ситуацию.

Если вы не знаете, о чем я говорю, я рекомендую googleing для образцов WCF.

EDIT
Вы пишете в комментариях, что вы создали класс обслуживания с собственным полем. Я полагаю, вы на самом деле не делали то, что я предлагал :-) Я сказал: создайте одноэлементный класс, к которому обращается класс, обрабатывающий запросы get/set.

public class ValueHolder 
{ 
    private static ValueHolder m_singleton = null; 
    private int m_someValue; 

    private ValueHolder() 
    { 
     m_someValue = 0; 
    } 

    public static ValueHolder Instance 
    { 
     get 
     { 
      if (m_singleton = null) 
       m_singleton = new ValueHolder(); 
      return m_singleton; 
     } 
    } 

    public int SomeValue 
    { 
     get { return m_someValue; } 
     set { m_someValue = value; } 
    } 
} 

Итак, теперь у вас есть класс обслуживания окон, который используется для размещения службы WCF. Служба WCF содержит методы получения/установки значения от ValueHolder.Instance.SomeValue. Эти методы подвергаются клиенту, используя контракт с данными.

Запустите службу и добавить ссылку на службу к клиенту, используя соответствующий параметр в Visual Studio (не отсылку к DLL, но ссылка службы !!). Теперь клиент обращается к методам get/set службы.

Работа выполнена, где мои деньги? :-D

+0

привет я сделал, как у сказал, но он не работает. Я создал класс Service с методом set и get и частным полем со значением по умолчанию 5. Этот класс ссылается на службу Windows. Я запустил службу. Затем вызванный метод get из единичного тестового класса получил значение по умолчанию 5, затем я вызвал метод Set с аргументом 9, а затем снова вызвал метод Get. Mathod снова возвратил значение 5, а не 9, как ожидалось. – user137348

+0

Опубликовать код. Не могу сказать без кода. –

+0

просто отлично, он отлично работает! Какой номер вашей учетной записи? :-) Чтобы сделать еще один шаг, не лучше ли иметь фабричный метод для получения синглетов? – user137348

0

Похоже, что отдельная услуга может немного похудеть за то, что вам нужно - может быть, вам стоит взглянуть на общую память Inter-Process.

Взгляните на № 3 этой статьи.

http://www.codeproject.com/KB/threads/csthreadmsg.aspx

+0

Я думаю, что клиент должен быть веб-приложением, которое усложняет использование памяти Inter Process :-) –

Смежные вопросы