Windows服务中的WCF服务,用于系统状态监视

时间:2018-11-07 22:21:20

标签: c# wcf windows-services

这很重要:这里有庞大的个人识别系统,其中一部分负责处理识别请求。因为它最初并不是为暴露给客户而设计的,而是作为Windows服务实现的,所以很难确定其中到底发生了什么。 因此,我的任务是使用WCF服务扩展现有的Windows服务(WS),该服务会将部分数据公开给简单客户端以进行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也具有Installer类,没什么特别的

[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,以为“服务”属性分配实际的ProcessingService对象。

下一步是使用installutil.exe部署WS服务(可以安装和启动服务,这里没有任何中断),但是调试它非常痛苦,因此出于调试目的,我必须以某种方式模拟WS服务行为。也许与我想的控制台应用程序一样。

另一个问题是StateMonitorService的位置-它应该与Processing Service在同一项目中还是在Separe项目中?

我还不清楚如何在调试和发布配置中如何在客户端(这种WPF应用程序)中使用这种不常见的WCF服务。

对于这三个难点的任何想法,以及对我有帮助的其他提示,我将不胜感激。

0 个答案:

没有答案