Как получить доступ к одноэлементным данным / данным инициализации из службы WCF? - PullRequest
0 голосов
/ 06 апреля 2011

Я создал проект Служба Windows + Служба WCF в качестве Инструкции MSDN: Как разместить Службу WCF в управляемой службе Windows .

В моей ситуации, однако, у меня есть таймер, инициализированный OnStart службы Windows. Я хочу, чтобы служба WCF имела возможность доступа, запроса и взаимодействия с данными службы Windows, например, для запуска и остановки таймера.

Я не хочу создавать таймер в классе обслуживания WCF, чтобы время жизни класса WCF могло быть PerCall (верно? Или я должен просто изменить это?). Как класс WCF может найти объект таймера?

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

Я всегда рекомендую любые советы, которые дает @marc_s. В этом случае, однако, посчитайте меня смущенным.

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

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

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

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

1 голос
/ 06 апреля 2011

Честно говоря, не может.

Ваша служба Windows будет содержать ServiceHost, которая является средой размещения вызовов службы WCF. Внутри вызова службы WCF вы можете получить доступ к его .Host - например, экземпляр ServiceHost, который работает внутри вашей службы Windows NT - но вы не можете достичь «дальше», чем это.

Чтобы получить доступ к хосту для данного метода обслуживания, используйте следующую строку кода:

ServiceHost yourHost = OperationContext.Current.Host;

Итак, вам нужно найти способ сделать этот таймер доступным на объекте хоста службы - например, путем создания своего собственного ServiceHost потомка, который имеет доступ к этому таймеру или содержит его.

Я не думаю, что есть какой-либо другой способ "выйти" из вызова службы WCF.

0 голосов
/ 06 апреля 2011

Это можно сделать с помощью ECollective - ECollective размещает службы WCF, а также службы таймера в одном контейнере, чтобы вы могли обмениваться данными между ними.

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