C# 向用户显示 Windows 服务更新通知

Posted

技术标签:

【中文标题】C# 向用户显示 Windows 服务更新通知【英文标题】:C# Show windows service updates notification to user 【发布时间】:2021-02-06 06:15:46 【问题描述】:

我是 .NET 新手,正在寻求有关 Windows 服务更新通知的帮助。

我有一个类似于“https://***.com/questions/41232170/c-sharp-show-notification-prompting-a-update”的用例。

该应用程序使用 C#.NET 开发,并作为 Windows 服务部署和运行。 但是,该应用程序没有使用任何 MSI 安装程序来安装它。我正在使用配置 Windows 服务应用程序的批处理脚本。

现在,我想在系统重新启动时向用户显示有关 Windows 服务更新的通知。

我偶然发现了 WCF 的用法或使用任务计划程序,但不确定哪个是更好的解决方案。

请指教。

【问题讨论】:

我通常会创建一个 wcf 服务并将其托管在 Windows 服务中。现在您是否要将更新通知推送到运行服务的客户端计算机或服务器。现在还需要您使用的绑定类型和模式。 你愿意分享你在windows服务中安装服务的批处理脚本 嗨,阿齐兹,感谢您的回复。要求是如果更新可用,Windows 服务将每天从远程服务器查找更新,通知弹出窗口应在系统重新启动时显示给用户。关于批处理脚本 - 它使用普通的“sc”命令来创建服务并启动服务。 服务不与任何用户桌面交互 - 您需要在用户会话中运行一个单独的程序。 这确实是许多“从服务中显示 UI”(如 ***.com/questions/2652254/…)的副本,但这篇文章得到了更长的答案,所以...... 【参考方案1】:

好的,有(因为 MS 禁用了我要解释的第一个)两种方法来通知您的用户有关服务的更新。

首先,糟糕、丑陋(在最近的版本中无法使用)方式:交互式服务。

您可以configure a service as interactive,如果您添加 SERVICE_INTERACTIVE_PROCESS 标志,该服务将能够创建一个将附加到 Display_0 的 GUI。这会带来 大量 的问题(尝试在没有用户会话时显示 GUI,如果您有两个会话打开,则只有第一个会显示 GUI 等等),但这是一种廉价的肮脏方式向用户显示数据。避免它。

第二,正确的方法:独立的 GUI 程序。

在这种情况下,您可以创建一个辅助程序来向用户显示数据,您可以start it with the user session 或让用户通过手动打开此应用程序来决定是否要接收信息。该程序需要以某种方式从服务接收更新,这取决于您,但我会为此使用 UDP,这样您的服务就不需要关心是否连接了任何 GUI 应用程序,您broadcast an UDP message 并且每个收听的人都会收到它,您不需要维护处理连接的服务器,不需要存储来维护事件数据,它将支持任意数量的 GUI 实例(如果不止一个用户在机器上启动了一个会话,他们都会收到通知)。

但正如我所说,这将是我的偏好,您可以随心所欲地进行操作,您可以使用管道,使用包含事件的文件并使用 FileSystemWatcher 在其中发生更改时获得通知,您甚至可以托管实现 SignalR 集线器的 ASP .net Web 应用程序,然后您可以在 html 中创建 GUI。由您决定哪种机制最适合您的方案。

【讨论】:

嗨古斯曼,感谢您的回答!我认为第二个选项将是首选选项,我们可以让辅助程序在系统托盘中运行,并且一旦更新可用,通知就会显示给用户。 没有“系统托盘”这样的东西。曾经的“通知区”已经被“行动中心”所取代。 @IInspectable 的“通知区域”也称为系统托盘系统托盘,它可能是错误的但大家都明白它是什么。

以上是关于C# 向用户显示 Windows 服务更新通知的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 从 Windows 窗体向用户显示默认的 Windows 身份验证提示?

当我使用 PHP 服务时,Windows Phone 7 推送通知未显示在我的手机上

当我在 Android 应用程序中更新我的 Sqlite 数据库时,如何向用户发送通知?

背水一战 Windows 10 (109) - 通知(Tile): 按计划显示 tile 通知, 轮询服务端以更新 tile 通知

Windows Phone 8.1:向指定用户发送通知

当应用收到通知时,IOS 向 HTTP 服务器发送请求