Контекст:WCF: Доступ к экземпляру службы с сервера
Мне нужно разработать сервер мониторинга, который контролирует некоторые из наших приложений (эти приложения в C#). Поэтому я решил разработать систему с WCF, которая кажется подходящей для моих нужд.
Эти приложения должны регистрироваться на сервере мониторинга при их запуске. После этого сервер мониторинга может вызывать методы «Пуск» или «Стоп» этих приложений.
Все полностью выполнено на одной машине, ничего не нужно выполнять удаленно.
Итак, я разработал хороший прототип, и все работает нормально. Каждое приложение регистрируется на сервере мониторинга.
Вопрос:
ApplicationRegistrationService
(см код ниже) является внедрение службы мониторинга и одноэлементно экземпляр из-за атрибута ServiceBehavior
.
Здесь моя проблема: я хочу получить доступ к контенту ApplicationRegistrationService
на пример, количество подключенных приложений с моего сервера (ConsoleMonitoringServer
в примере). Но я не уверен, как этого добиться.
Нужно ли создать канал на моем сервере для службы, как это было у моих клиентов (ConsoleClient
), или существует лучший способ достичь этого?
Код:
Код очень упрощенный для целей данного вопроса:
//The callback contract interface
public interface IApplicationAction
{
[OperationContract(IsOneWay = true)]
void Stop();
[OperationContract(IsOneWay = true)]
void Start();
}
[ServiceContract(SessionMode = SessionMode.Required,
CallbackContract = typeof(IApplicationAction))]
public interface IApplicationRegistration
{
[OperationContract]
void Register(Guid guid, string name);
[OperationContract]
void Unregister(Guid guid);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ApplicationRegistrationService : IApplicationRegistration
{
//IApplicationRegistration Implementation
}
public class ApplicationAction : IApplicationAction
{
//IApplicationAction Implementation
}
Консоль приложения для этого примера
class ConsoleClient
{
static void Main(string[] args)
{
ApplicationAction actions = new ApplicationAction();
DuplexChannelFactory<IApplicationRegistration> appRegPipeFactory =
new DuplexChannelFactory<IApplicationRegistration>(actions,
new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/AppReg"));
IApplicationRegistration proxy = appRegPipeFactory.CreateChannel();
proxy.Register(Guid.Empty, "ThisClientName");
//Do stuffs
}
}
сервер консоли
для этого пример
class ConsoleMonitoringServer
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(ApplicationRegistrationService),
new Uri[]{ new Uri("net.pipe://localhost")}))
{
host.AddServiceEndpoint(typeof(IApplicationRegistration),
new NetNamedPipeBinding(), "AppReg");
host.Open();
//Wait until some write something in the console
Console.ReadLine();
host.Close();
}
}
}
Спасибо за ссылки, но я уже сделать подобную вещь в моем коде. –