代码之家  ›  专栏  ›  技术社区  ›  Phil

.NET Windows服务向用户报告错误的最佳方法

  •  6
  • Phil  · 技术社区  · 16 年前

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

    6 回复  |  直到 16 年前
        1
  •  7
  •   Piotr Justyna    16 年前

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

        2
  •  5
  •   Jerod Venema    16 年前

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

        3
  •  4
  •   Shoban    16 年前

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

        4
  •  3
  •   Dave    16 年前

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

        5
  •  2
  •   Hans Passant    16 年前

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

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

    一定要处理用户决定不运行或终止桌面应用程序的可能性。您应该用eventlog类记录任何错误。

        6
  •  1
  •   Matt Davis    16 年前

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

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

    无论如何,我想指出的一点是,WCF是让您的服务和前端应用程序进行通信的最直接的方式。人们会争论与WCF相关的所谓“陡峭”的学习曲线,但我没有经历过。我发现WCF是一种非常有效的进程间通信方式。你可以看 this video 让您对WCF编程范式有一些了解。