这很重要:这里有庞大的个人识别系统,其中一部分负责处理识别请求。因为它最初并不是为暴露给客户而设计的,而是作为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服务。
对于这三个难点的任何想法,以及对我有帮助的其他提示,我将不胜感激。