Служба WCF внутри службы Windows для мониторинга состояния системы - PullRequest
0 голосов
/ 08 ноября 2018

Вот в чём дело: существует ОГРОМНАЯ система идентификации личности, одна часть которой отвечает за обработку запросов идентификации. потому что изначально он не предназначен для контакта с клиентами, он реализован как служба 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, как в конфигурации отладки, так и в конфигурации выпуска.

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

...