使用C#开发Windows服务的建议

时间:2009-09-12 14:02:40

标签: c# windows-services

我正在开发一个分布式应用程序,其中每个分布式站点将运行基于2层winform的客户端 - 服务器应用程序(具体原因是不进入Web架构)。本地应用程序服务器将负责与中央服务器通信,本地工作站将与本地服务器进行通信。

我即将开发一个或多个Windows服务以实现以下目标。我认为其中一些将在本地服务器上运行,而一些在本地工作站上运行。中央服务器只是一个SQL Server数据库,因此不会在此端开发服务,只会从本地服务器触发DML语句。

Windows服务目标

  1. 根据计划将本地数据与来自中央服务器(两端SQL Server)的数据同步
  2. 根据时间表进行自动数据库备份
  3. 根据时间表自动从供应商网站下载软件更新
  4. 通过监控连接的工作站实施软件许可证管理
  5. 工作站和/或本地服务器之间的Intranet消息传递(如更丰富的NET SEND实用程序)
  6. 管理从本地服务器到工作站的更新部署
  7. 虽然我有一些想法,但我在决定时有点困惑,我需要与像你这样的专家交叉检查我的想法。以下是我的疑问 -

    1. 本地服务器上应运行多少服务? 请指定各个服务角色。

    2. 应该在工作站上运行多少个服务? 请指定各个服务角色。

    3. 由于某些服务需要查询本地SQL数据库,服务应该从哪里读取连接字符串?注册表?配置文件?还有其他任何地方吗?

    4. 如果一项服务需要执行多项任务,例如就像调度程序服务一样,在管理计划任务的性能方面应该是最佳/最佳方式 一个。为计划任务构建.NET类库程序集,并在不同的线程上进行旋转 湾为计划任务构建.NET可执行程序集并触发可执行文件

    5. 虽然单个帖子中的问题似乎太多,但它们都是相关的。我稍后会与论坛分享我的观点,因为我不想以任何方式偏向论坛的观点/建议。

      提前感谢你们所有人。

3 个答案:

答案 0 :(得分:2)

  

本地服务器上应运行多少服务?

这取决于很多因素,但我通常会尽可能减少服务,因为维护和监视一项服务对于管理员而言比对许多服务的工作要少。

  

应在工作站上运行多少服务?

我只会使用一个,因为这会使它成为单点故障。用户将注意到工作站上的服务是否已关闭。如果是这种情况,则只需要启动一个服务。

  

由于某些服务需要查询本地SQL数据库,服务应该从哪里读取连接字符串?注册表?配置文件?还有其他地方吗?

我通常会将连接字符串放在app.config中。 .NET框架还提供加密连接字符串的工具。

  

如果一项服务准备执行多项任务,例如就像调度程序服务一样,关于管理计划任务的性能,应该是最佳/最佳方式。为计划任务构建.NET类库程序集并在单独的线程上进行旋转b。为计划任务构建.NET可执行程序集并触发可执行文件

湾更容易设计和实施。它使您可以使用Windows调度程序。在这种情况下,当Windows调度程序启动可执行文件时,当前一个启动尚未完成时,您需要考虑问题。这导致两个过程,可以做同样的事情。如果这不是问题,那么请继续使用该设计。如果是问题,请考虑解决方案a。

解决方案a。查看Quartz.NET,它为您提供了许多高级计划功能。还考虑使用application domains而不是线程来使服务更健壮。

如果您没有获得本地服务器的管理员权限,请考虑在没有服务控制管理器的情况下重新启动服务的方法。为某些特权用户提供从客户端计算机重新初始化服务的可能性。

如果一个服务正在执行多项任务,还要考虑重新启动服务的一部分的方法。例如,服务行为异常,因为更新任务运行错误。如果您需要重新启动整个服务来修复此问题,则所有用户都可能会意识到这一点。提供一些方法来仅重新初始化更新任务。

最重要的是:如果您找到更轻松的方法来实现目标,请不要遵循我的任何建议。从简单的设计开始。不要过度工程!具有(多个)服务和调度的解决方案往往会在每个添加的功能的复杂性中爆炸。特别是当你需要让服务相互交谈时。

答案 1 :(得分:1)

我认为没有一个答案,有些可能只使用一个服务,而其他人会将每个域模块化为服务并添加企业事务服务等。问题更多的是SOA而不是C#,你可能会考虑阅读一些SOA书籍以找到你的模式。

答案 2 :(得分:0)

这并没有具体回答您的问题,但有一点需要考虑的是您可以在同一个流程中运行多个服务。 ServiceBase.Run方法接受一组ServerBase个实例来启动。它们是技术上不同的服务,在服务控制管理器中显示,但它们在同一进程中执行。同样,只需要在更广泛的问题背景下考虑一些事项。