【问题标题】:How to update a .net windows service from a central location如何从中心位置更新 .net Windows 服务
【发布时间】:2011-02-03 21:32:16
【问题描述】:

我们已经构建了一个 .NET Windows 服务,我们将其安装在客户端 PC 上,以监控和上传来自这些 PC 的数据(通过 Web 服务)。我正在寻找一种方法来集中更新所有客户端 PC 上的 Windows 服务 -- 无需远程访问每个商店。

这里有一些细节(虽然,我 不要认为这真的很重要):

  • Windows 服务:.NET 版本 2(由于客户端 PC 限制)- VB.NET
  • Web 服务:.NET 版本 4 - VB.NET
  • 客户端 PC 操作系统:Win2000 到 Win7、POSReady、WEPOS

一些额外信息

  • 我们有一个运行良好的安装文件,但我们需要远程进入每个商店才能运行它。并且有 100 家商店!
  • 我们曾考虑将安装文件放在 FTP 站点上,但被告知 Windows Embedded OS 不支持 FTP,因此我们可能会通过 Web 服务发送文件
  • 每个 Windows 服务每分钟调用一次 Web 服务方法,该方法返回一个 XML,可用于发送更新 Web 服务的指令。

这似乎是开发人员需要多次解决的标准问题。如果有人有任何建议或可以建议他们使用的流程,那真的会对我们有所帮助。

更新

  • 我可以同时更改 Windows 服务和 Web 服务来添加这个新的更新功能
  • 看起来我有办法获取安装文件(从 Web 服务方法下载),但是运行它呢?如何运行安装程序,然后确保 Windows 服务已关闭?安装程序或 Windows 服务是否执行此操作?

【问题讨论】:

    标签: .net deployment windows-services process


    【解决方案1】:

    如果您有网络服务,您可以添加更新方法。

    创建一个小的更新安装程序或应用程序(您可以在本地运行)。
    然后在 Web 服务中添加一个返回 Stream 或 byte[] 数组的方法。
    在 web 服务的方法中,将二进制安装程序文件读入 byte[] 数组或流中,然后发送给客户端。

    然后让客户端将该流保存到一个文件中,现在您在客户端计算机上就有了安装程序。
    剩下要做的就是运行该进程并更新服务。

    【讨论】:

    • 很好的答案,如果他已经在他的应用程序中内置了这样的东西。我敢打赌,他不会,但在经历了手动推送补丁安装程序或获取补丁的更新程序的头痛之后,他会的。
    • 现在在应用程序中构建它,手动更新它们(发送所有安装或其他东西)然后下次你不必担心。
    • 感谢您的回答,您是对的:我可以更改我的应用程序,以便客户端可以从 Web 服务保存文件。但是下载之后呢。如何从需要关闭才能升级的程序运行安装程序?
    • 您从服务(或更新程序)运行程序,并让您的安装程序关闭该服务。
    【解决方案2】:

    如果补丁是 MSI 包,您可以使用 Active Directory 将更新推送到 AD 服务器控制下的同一网络中的计算机。然后更新将立即运行或在下次启动时运行。

    您可以自己推送包,但必须有某种传输机制在另一端进行侦听,由具有足够智能和权限的程序控制以自动执行更新。

    除了 AD,这可能是您最好的选择:使用普通的网络文件共享将更新推送到客户端。客户端计算机必须正在运行,但它可以在欢迎屏幕上。然后,在 Documents & Users/All Users/Start Menu/Startup 文件夹中放置一个批处理文件,该文件夹将执行 MSI 的“固定安装”(基本上是告诉 MSI 使用默认安装参数执行静默安装)。在下一次用户登录时,批处理文件将运行,执行安装。 MSI 之后可能会清理批处理文件。如果您可以远程访问客户端计算机的注册表(我非常怀疑),您可以将批处理文件放在某个临时目录中,并将对它的引用放在 RunOnce 注册表文件夹中。

    通过这个 rigamarole 一次可能会教您构建这样的应用程序,以通过已知的 Web 服务检查和下载它们自己的更新,或者将它们设置为使用 ClickOnce 部署(这会使安装目录变得混乱,但更新部署会简单得多)。

    【讨论】:

    • 感谢您的回答。重新“......可能会教你构建这样的应用程序以通过已知的网络服务检查和下载他们自己的更新”,我可以更改应用程序,所以请告诉我更多关于使用已知网络服务来更新我的应用程序的信息。
    • 基本上,该模式是您的应用程序在打开时应该调用一个简单的 Web 服务,该服务将告诉它最新发布的软件版本,并将其与自己的进行比较。如果它们不同,请调用另一个 Web 服务来下载并运行更新包。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多