.Net Windows 服务向用户报告错误的最佳方式

Best way for a .Net Windows service to report an error to the user

提问人:Phil 提问时间:12/12/2009 更新时间:12/12/2009 访问量:2984

问:

我正在编写一个 Windows 服务,该服务将进行大量网络通信,我需要一种方法来通知用户(如果登录)任何异常/错误。我知道允许服务与桌面交互是一种不好的做法,那么有没有其他方法可以通知用户发生了错误?我知道事件日志记录,但我也希望能够显示系统托盘中的通知气泡或引起用户注意的内容。

C# Windows 服务 异常 错误报告

评论


答:

4赞 Shoban 12/12/2009 #1

使用另一个应用程序与此应用程序交互并通知用户有关错误的情况如何?这样,您就可以为用户提供“选项”。可能会关闭警报、电子邮件等

5赞 Jerod Venema 12/12/2009 #2

通常,你将有一个服务可以通知的辅助应用。例如,您可以有一个系统托盘图标 (ugh),当发生重要事情时会弹出气球 (double ugh)。然后,应用程序本身也可以显示一个界面,用于为您的服务设置设置。

7赞 Piotr Justyna 12/12/2009 #3

请考虑使用事件日志和单独的应用程序进行监视。您也可以考虑使用电子邮件或 MSMQ。

3赞 Dave 12/12/2009 #4

您可以使用一些现有的通知应用程序,例如 Growl: http://www.growlforwindows.com/gfw/。这将允许用户“选择加入”。

2赞 Hans Passant 12/12/2009 #5

您必须提供“与桌面交互”选项的替代方案。Vista 和 Win7 不再支持它。向受限用户授予对在高特权帐户上运行的 UI 的访问权限被认为存在太大的安全风险。谷歌“会话 0 隔离”以查找有关此的详细信息。

需要使用 .NET 支持的进程互操作机制之一来设置服务与 UI 应用之间的交互。对于简单的消息传递,请使用套接字或命名管道。管道名称需要具有“Global\”前缀才能对所有会话可见。对于更复杂的交互,可以使用远程处理或 WCF。

请务必处理用户决定不运行或终止桌面应用程序的可能性。应使用 EventLog 类记录任何错误。

1赞 Matt Davis 12/12/2009 #6

为了解决此问题,我创建了一个 Windows 窗体应用程序,用户可以随意启动和停止该应用程序。当然,Windows 服务在后台 24/7 全天候运行。当应用程序启动时,它使用 Windows Communication Foundation (WCF) 来查询服务的当前状态 - 它是否处于活动状态、连接了多少个客户端、收集了多少字节等。然后,此信息将呈现给应用程序内部的用户。

我试图模仿任务管理器的行为,因此我还在应用程序的主窗体中添加了一个在系统托盘中显示图标的窗体。当应用程序打开时,将显示系统托盘图标。用户可以将应用程序最小化到任务栏,也可以完全隐藏应用程序。托盘图标仅在用户关闭应用程序时消失。托盘图标还支持双击以重新打开应用程序,并支持弹出菜单以快速访问功能。System.Windows.Forms.NotifyIcon

无论如何,我想说的是,WCF 是让服务和前端应用程序进行通信的最直接方式。人们会争论与 WCF 相关的所谓“陡峭”学习曲线,但我没有经历过。我发现 WCF 是开发进程间通信的一种非常有效的方法。您可以观看此视频,深入了解 WCF 编程范例。