Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows服务中托管WCF服务-并在开始时启动一些东西_C#_Wcf_Service_Hosted - Fatal编程技术网

C# 在Windows服务中托管WCF服务-并在开始时启动一些东西

C# 在Windows服务中托管WCF服务-并在开始时启动一些东西,c#,wcf,service,hosted,C#,Wcf,Service,Hosted,我在网上搜索过,但我认为我的理解问题比技术问题更严重。。 作为一名精读S.O.的读者,我知道我必须公开我的全部需求,而不是简单地问我的问题…所以 开发人员:VisualStudio2010(…),C#,目标框架3.5客户端配置文件 我的基本要求: 这是我的要求:我想有一个可下载的软件,将安装在客户端计算机上。此工具将定期执行一些任务[从我们使用的精确ERP系统下载一些销售数据(发票、订单)。 我不希望用户必须登录才能让我的工具工作(如果计算机重新启动,我希望我的工具能够启动)。因此,在这里,标准

我在网上搜索过,但我认为我的理解问题比技术问题更严重。。 作为一名精读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");
            }
        }