2016-06-17 6 views
1

Я пишу свой первый сервис WCF, но я немного не уверен, где должна выполняться основная функция сервиса.Служба WCF, размещенная в службе Windows. Какую работу нужно выполнять?

Основная цель моей службы - выполнять задачи по расписанию и в конечном итоге регистрировать свой статус на удаленном сервере. Идея службы WCF заключается в том, чтобы разрешить связь между приложением в системном трее и службой. Мой вопрос: где я должен реализовать планирование задач и ведение журнала базы данных?

Должно: A) служба Windows обслуживает только службу WCF и ничего не делает, оставив службу WCF выполнять всю работу и связь.

B) служба Windows обслуживает службу WCF и выполняет всю работу, предоставляя службе WCF осуществлять связь и ничего больше.

В случае B, как служба Windows получает данные от службы WCF и из нее? Служба ServiceHost не предоставляет доступ к методам службы WCF. Так что мне нужно создать новый экземпляр клиента и подключиться к службе WCF так же, как и в приложении в системном трее? Возможно ли иметь более одного одновременного соединения? (Я использую net.tcp, главным образом потому, что в этом учебнике я использовал его.) Также есть вероятность, что я могу захотеть, чтобы серверное приложение снова подключилось к клиенту WCF.

ответ

1

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

После того, как у вас есть реализация службы WCF, вы можете разместить ее разными способами. Один из способов - это процесс Windows Service. Для этого вы обычно создаете System.ServiceModel.ServiceHost, содержащий ваш тип обслуживания (или экземпляр) и Open().

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

Итак, ваш вариант «А» близок к тому, что вы хотите.

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

Для обработки нескольких одновременных операций вам необходимо ознакомиться с System.ServiceModel.ConcurrencyMode.

Обратите внимание, что в вашем случае, если вы не ожидаете вызвать службу с другого компьютера, вам может потребоваться named pipe binding вместо привязки TCP.

+0

Согласен, я думаю, что вариант A звучит лучше всего, потому что в конечном итоге служба Windows может быть тем, что вы хотите использовать для своего конечного пользователя, но это может быть не в будущем (по сравнению с сервисом WCF, который более общая оболочка). Подумайте так. Если вы хотите добавить поддержку linux или адаптироваться к изменению ОС Windows, то вы были бы рады минимизировать свою зависимость от окон. Зависимость от WCF - это меньшее из 2 зол. Я подозреваю, что это будет справедливо в течение нескольких десятилетий (как философии). – Dessus

+0

Спасибо. Я понимаю, что нет «главной» функции/точки входа, например, в консольном приложении.Но на основе варианта A, поскольку вы оба предположили, что мой план будет состоять в том, чтобы использовать «Public Sub New», чтобы запустить таймер, который будет ждать запланированного времени и запускать пользовательские функции для выполнения требуемых задач. Не могли бы вы сказать, что это возможно? На данный момент я не уверен, но в какой-то момент я могу вызывать функции с удаленной машины, чтобы сервер мог обновлять запланированное время. Но в противном случае я посмотрю на названные каналы. Я обязательно рассмотрю режим параллелизма. – Daniel

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