Вот в чём дело: существует ОГРОМНАЯ система идентификации личности, одна часть которой отвечает за обработку запросов идентификации. потому что изначально он не предназначен для контакта с клиентами, он реализован как служба Windows, поэтому трудно точно знать, что именно происходит внутри него.
Итак, моя задача - расширить эту существующую службу Windows (WS) с помощью службы WCF, которая предоставит часть данных простому клиенту для мониторинга внутреннего состояния WS.
Вот код самой службы Windows:
public partial class ProcessingService : ServiceBase
{
public BisProcessingService()
{
this.InitializeComponent();
}
//collection which would be consumed by WCF service
public ObservableCollection<SomeClass> SomeClassCollection { get; set; }
protected override void OnStart(string[] args)
{
//SomeClassCollection initialization
}
protected override void OnStop()
{
//shutting down operations
}
}
WS также имеет класс установщика, ничего особенного
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
InitializeComponent();
}
}
Вот некоторые отличия от книги. Файл Programm.cs изменен так:
public static class Program
{
public static ServiceHost MonitoringServiceHost = null;
private static ProcessingService ProcessingService = new ProcessingService();
/// <summary>
/// The main entry point for the application.
/// </summary>
public static void Main()
{
ConfigureMonitoringHost();
ServiceBase[]ServicesToRun;
ServicesToRun = new ServiceBase[]
{
ProcessingService
};
ServiceBase.Run(ServicesToRun);
}
static void ConfigureMonitoringHost()
{
StateMonitorService d = new StateMonitorService();
d.service = ProcessingService;
MonitoringServiceHost = new ServiceHost(d);
MonitoringServiceHost.Open();
}
}
Здесь MonitoringServiceHost и ProcessingService объявляются как отдельные поля, не помещая MonitoringServiceHost непосредственно в класс ProcessingService, как предлагает обычная практика.
StateMonitorService - это служба WCF, предназначенная для мониторинга состояния ProcessingService. Имеет интерфейс:
[ServiceContract]
public interface IStateMonitorService
{
[DataMember]
ProcessingService service { get; }
//other methods
}
который реализован в классе обслуживания:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class StateMonitorService : IStateMonitorService
{
public ProcessingService service { get; set; }
//other methods implementation
}
Целью такого дизайна является предоставление StateMonitorService информации о любых данных, которые хранятся в WS (SomeClassCollection на данный момент). В ConfigureMonitoringHost метод MonitoringServiceHost создается с помощью объекта службы, а не типа его интерфейса, чтобы присвоить свойству 'service' фактический объект ProcessingService.
Следующим шагом является развертывание службы WS с помощью installutil.exe (служба может быть установлена и запущена, здесь ничего не ломается), но отладка очень болезненна, поэтому для целей отладки мне нужно каким-то образом эмулировать поведение службы WS. возможно с консольным приложением, как я полагаю.
Другой вопрос - местоположение StateMonitorService - должно ли оно быть в одном проекте со Службой обработки или в отдельном проекте?
Кроме того, мне совершенно неясно, как использовать такую необычно размещенную службу WCF в клиенте, который является приложением WPF, как в конфигурации отладки, так и в конфигурации выпуска.
Буду признателен за любые мысли относительно этих трех точек зрения, а также за любые другие советы, которые помогут мне в процессе.