【发布时间】:2013-07-17 12:12:12
【问题描述】:
我在网上搜索过,但我认为我有更多的理解问题而不是技术问题.. 并通过密集的 S.O.读者,我知道我必须公开我的全部要求,而不是简单地问我的问题......所以......
开发资料:Visual Studio 2010 (..)、C#、目标框架 3.5 客户端配置文件..
我的基本要求:
这是我的要求:我想要一个可以安装在客户端计算机上的可下载软件。该工具会定期从我们使用的精确 ERP 系统中执行一些任务 [下载一些销售数据(发票、订单)。
我不希望用户必须登录才能让我的工具工作(如果计算机重新启动,我希望我的工具仍然启动)。所以在这里,一个标准的 Windows 服务似乎是最好的选择,它带有一个前端应用程序来允许设置一些选项,并查看工作人员的状态。至此,我有了一个 Windows 服务(c# 3.5)和一个前端工具。请注意,此时它对我来说效果很好。在我的服务的 OnStart 方法中,我“启动”我所有的东西(准备文件夹、获取选项、连接到我在云上的远程 SQL Server、验证系统是否良好,然后等待任务,并使用计时器检查用于运行任务)。到这里为止,一切都按预期进行。
前端工具和我的 Windows 服务之间的高级通信
现在,我想通过我的前端工具与我的服务交谈/询问一些事情。我想问(“你现在正在运行多少进程”、“你的实际计时器状态是什么”、“你当前正在运行哪些表”、“中止你的所有任务”等等)。我通过向我的 Windows 服务发送自定义命令尝试了一点“自定义命令”,但它确实受到限制:为了知道“您当前正在加载哪些表”问题的答案,我试图写在自定义事件日志,并从我的前端应用程序中检索它,但我发现它并不干净,因为我可能希望从我的工具中获得快速和重复的反馈(例如,看到加载一张表的进度,每 5 次刷新一次秒)。还有写入硬盘驱动器上的文件,但我可能希望将我的服务托管在另一台计算机上,然后是前端工具。
WCF 路径
选项 1 - WCF 服务只是一个沟通者,仅此而已。
因此,正如在 Internet 上发现的那样,我开始研究托管 WCF 服务选项。所以首先,我只在我的主 Windows 服务中添加了一个简单而温和的 WCF 服务库。该子 WCF 服务只会响应来自前端工具的复杂问题,然后向其创建者(主要 Windows 服务)寻求响应。我的基本设置工作 -> 在我的 Windows Servbice 的 OnStart 中,我启动了我所有的业务,并启动了(HostService)我的 WCF 服务来监听。但是我看不到任何方法可以在我的 Windows 服务和我的 WCF 服务之间建立完整的链接(以便能够访问主要的服务复杂信息)。静态方法?将主要的“状态”类传递给 WCF 服务,但是如何? ..
选项 2 - Wcf 服务就是一切。
然后,我尝试将我的所有代码移动到我的 WCF 服务中,并说“好的,如果只有一个可以做到这一点,为什么还要有 2 个程序集”。因此,在我的基本 Windows 服务的 OnStart 中,不再启动我的业务内容。仅启动子 WCFServices。在概念层面上一切似乎都很好。 但是我怎么能说“好的,WCF 服务,开始倾听,并启动业务”? 我没有找到关于 WCF 服务的“启动时启动代码”的信息。在网络上,我看到很多“WCF 服务主要用于‘随叫随到’。但我希望 WCF 服务通过计时器完成我的所有工作(加载表、将它们上传到 cload 等)并且能够与前端工具对话。我必须在主 Windows 服务中创建 WCF 服务,并立即连接到它以请求特定的公开方法(通过服务合同)吗?
所以,我的问题: 1 - 我的架构有意义吗? 2 - WindowsService->WCFService 托管对我的要求有意义吗? 3 - 我应该将所有代码移动到 WCF 服务库吗?与否
非常感谢!
西蒙
编辑:
感谢 FerretallicA!
老实说,我更喜欢把所有东西都分开。所以我喜欢你将我的类的引用传递给我的 WCF 服务的想法。
只是为了更完整的东西,这是我的主要 Windows 服务的 OnStart 方法:
注意:(很多代码来自:How to: Host a WCF Service in a Managed Windows Service
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");
}
}
所以,我试图弄清楚我必须在哪里将引用传递给我的“MyMainClass”类。
注意:我刚刚重新搜索了您的想法“如何传递对子 wcf 服务的引用”,我发现:S.O. question - WCF call that references Windows Service。稍后我会深入阅读。
【问题讨论】:
-
我也在我们的 ERP 系统中使用 WCF 服务,但我只将它用于 webportal/