C# 在Windows服务中托管WCF服务-并在开始时启动一些东西
我在网上搜索过,但我认为我的理解问题比技术问题更严重。。 作为一名精读S.O.的读者,我知道我必须公开我的全部需求,而不是简单地问我的问题…所以 开发人员:VisualStudio2010(…),C#,目标框架3.5客户端配置文件 我的基本要求: 这是我的要求:我想有一个可下载的软件,将安装在客户端计算机上。此工具将定期执行一些任务[从我们使用的精确ERP系统下载一些销售数据(发票、订单)。C# 在Windows服务中托管WCF服务-并在开始时启动一些东西,c#,wcf,service,hosted,C#,Wcf,Service,Hosted,我在网上搜索过,但我认为我的理解问题比技术问题更严重。。 作为一名精读S.O.的读者,我知道我必须公开我的全部需求,而不是简单地问我的问题…所以 开发人员:VisualStudio2010(…),C#,目标框架3.5客户端配置文件 我的基本要求: 这是我的要求:我想有一个可下载的软件,将安装在客户端计算机上。此工具将定期执行一些任务[从我们使用的精确ERP系统下载一些销售数据(发票、订单)。 我不希望用户必须登录才能让我的工具工作(如果计算机重新启动,我希望我的工具能够启动)。因此,在这里,标准
我不希望用户必须登录才能让我的工具工作(如果计算机重新启动,我希望我的工具能够启动)。因此,在这里,标准的Windows服务似乎是最好的选择,前端应用程序允许设置一些选项,并查看工作人员的状态。此时,我有一个Windows服务(c#3.5)还有一个前端工具。请注意,它在这一点上对我来说很好。在我的服务的OnStart方法中,我“启动”我的所有东西(准备文件夹、获取选项、连接到云上的远程SQL Server、验证系统是否正常,然后等待任务,并使用计时器检查任务是否运行).在这里之前,一切都按预期进行 前端工具和我的Windows服务之间的高级通信 现在,我想通过我的前端工具向我的服务部门询问一些事情。我想问(“你现在正在运行多少进程”,“你的实际计时器状态是什么”,“你当前正在运行哪些表”,“中止所有任务”,等等。)。我试过一点“自定义命令”通过向我的Windows服务发送自定义命令,但它确实受到了限制:为了知道“您当前正在加载哪些表”问题的答案,我尝试写入自定义事件日志,并从前端应用程序中检索该日志,但我不认为这是干净的,因为我可能希望从我的工具中获得快速且重新获取的反馈(例如,看到加载一个表的进度,每5秒钟刷新一次)。还有写入硬盘上的文件,但我可能希望将我的服务托管在另一台计算机上,而不是前端工具上 WCF路径 选项1-WCF服务只是一个通讯器,仅此而已。 因此,正如在互联网上发现的那样,我开始研究托管WCF服务选项。因此,首先,我只在我的主Windows服务中添加了一个简单而温和的WCF服务库。该子WCF服务只会回答前端工具提出的复杂问题,然后询问其创建者(主Windows服务)对于响应。我的基本设置工作->在我的Windows服务的启动中,我启动了所有的业务内容,并启动了(HostService)我的WCF服务来侦听。但是我看不到任何方法在我的Windows服务和我的WCF服务之间建立完全链接(以便能够访问主服务复杂信息).Static方法?将主“status”类传递给WCF服务,但如何传递 选项2-Wcf服务就是一切。 然后,我尝试将所有代码移动到我的WCF服务中,说“好吧,如果只有一个程序集可以做到这一点,为什么要有两个程序集”。因此在我的基本Windows服务的启动中,不再启动我的业务。只启动子WCF服务。在概念层面上,一切似乎都很好。 但我怎么能说“好的,WCF服务,开始倾听,开始做生意”? 我找不到任何关于WCF服务“启动时启动代码”的信息。在网络上,我看到很多“WCF服务主要是“随叫随到”的。但我希望WCF服务完成我的所有工作(加载表、上传到cload等)我必须在主Windows服务中创建WCF服务,并立即连接到该服务以请求特定的公开方法(通过服务合同) 那么,我的问题是: 1-我的架构有意义吗? 2-WindowsService->WCFService主机是否符合我的要求? 3-我应该将所有代码移到WCF服务库中吗?还是不 非常感谢 西蒙
编辑: 谢谢费雷塔利卡 老实说,我更喜欢把所有的东西都分开。所以我喜欢你的想法,把我的班级的参考资料传递给我的WCF服务 关于更完整的内容,以下是我的主Windows服务的OnStart方法: 注:(很多代码来自: 因此,我试图找出我必须在哪里传递对我的“MyMainClass”类的引用 注意:我刚刚重新搜索了您的想法“如何传递对子wcf服务的引用”,我发现:。稍后我将深入阅读 在你的情况下,这是否可行,取决于你的服务设计,但是我会考虑两个一般的方法,让你把服务A暴露给你的整体设计:
- 将对主服务实例的引用传递给构造函数中的WCF/监视服务
- 如果使用Castle Windsor之类的工具,请将您的主服务注册为singleton,以便监视服务可以从多个点访问主服务实例
[我意识到这条线索比较古老,但我自己阅读了这些类型的问答环节,以寻求指导;其他人可能会跟进,因为他们有类似的担忧。] 通常在最初的平台设计中,我会建议以下经验法则:从结尾开始。
protected override void OnStart(string[] args)
{
//The MyMainClass is global to my service.
MyMainClass = new DailyExtraction_MainClass();
//initiating the worker (setting the timer ticks, basic connexion,etc....)
MyMainClass.Initialiser_Robot_Extracteur();
//Write some log through my Worker
MyMainClass.MyLogExecution.WriteLog(" - End of OnStart()");
**//Here is the WCF Sub-service creation**
try
{
if (myWCFServiceHost != null)
{
myWCFServiceHost.Close();
}
// Create a ServiceHost for my class type and .
myWCFServiceHost = new ServiceHost(typeof(DailyExtractionUtils.CloudBI_Communicator));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
myWCFServiceHost.Open();
}
catch (Exception ex)
{
MyMainClass.MyLogExecution.WriteLog(" - Error while trying to create the WCF Service");
}
}