我正在开发一个应该连续运行的.Net服务器应用程序。我希望每次服务器进程因任何原因终止时都会发送通知电子邮件。理想情况下,如果异常导致终止,则电子邮件应包含异常消息和堆栈跟踪。我知道无法捕获某些异常,例如StackOverflowException
。那么如何记录/发送服务器进程中出现StackOverflowException
的通知?
我正在考虑创建第二个进程来监视服务器进程。但是如何获得异常的细节呢?
答案 0 :(得分:4)
诸如StackOverflowException之类的致命异常通常会导致Windows事件日志中的条目(甚至可能包括堆栈跟踪)。您可以监控您的事件日志(例如,使用其他服务),该日志将在某些条目上发送电子邮件。此处描述了用于监视事件日志条目的简单应用程序:
在这里:
<强> Send email alerts when errors are written to the event log 强>
如果您希望您的服务能够持续启动并运行,您可能需要将其配置为在崩溃的情况下自动重启(尽管您应该知道它通常是崩溃的原因并且只是重新启动并不一定会删除该原因)。您可以在服务属性下的 恢复 标签中执行此操作。在那里,您还可以选择在服务崩溃时调用自定义程序或脚本。
使用内置Windows功能的另一个选项是配置事件日志以发送电子邮件通知。这至少可以在Windows Vista上运行,如下所述:
<强> How to Setup Event Viewer to Send a Email Notification in Vista 强>
答案 1 :(得分:1)
实际上,您根本不需要任何第三方软件 - Win7任务计划程序可以在看到某种类型的事件时触发计划任务,并将未处理的异常写入事件日志。其中一个内置操作是“发送电子邮件”,因此您已经在操作系统中获得了整个解决方案
答案 2 :(得分:0)
我有一个应用程序(显示的代码)拦截未处理的异常并显示自定义异常对话框,这可能会有所帮助吗?
Imports BM.BEAST.Presenters
Imports BM.BEAST.Security
Imports BM.BEAST.Business
Imports System.Threading
Public Class StartUp
Shared Sub UnhandledException(ByVal sender As Object, ByVal e As System.Threading.ThreadExceptionEventArgs)
Dim unhandledException As New UnhandledExceptionView
unhandledException.uxExceptionDetails.Text = e.Exception.ToString
unhandledException.ShowDialog()
If unhandledException.uxRestart.Checked Then
Application.Restart()
Else
Application.Exit()
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Entry point
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Shared Sub Main()
'All unhandled exceptions are handled by the sub UnhandledException()
'which displays a BEAST exception dialog and gives the user the chance
'to copy the error to clipboard for pasting into email etc..
AddHandler Application.ThreadException, AddressOf UnhandledException
'Application framework not enabled
My.User.InitializeWithWindowsUser()
'Users must be authenticated
If My.User.IsAuthenticated Then
Dim securityPrincipal As Security.ISecurityPrincipal = Nothing
Dim applicationController As ApplicationController = Nothing
Try
'Custom security principal for use throughout the session
securityPrincipal = ServiceGateway.Instance.StartUserSession
AppDomain.CurrentDomain.SetThreadPrincipal(securityPrincipal)
Thread.CurrentPrincipal = securityPrincipal
applicationController = applicationController.GetInstance
applicationController.RegisterNavigator(New ApplicationNavigator)
'If a user holds more than 1 role they will have to select
'the role they want applied for use throughout the session
If securityPrincipal.Roles.Count > 1 Then applicationController.NavigateTo("SelectRoleView")
applicationController.NavigateTo("ShellView")
Catch ex As Exceptions.InvalidUserNameException
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Invalid User")
Catch ex As Exceptions.UserDisabledException
MsgBox(ex.Message, MsgBoxStyle.Exclamation, "User Disabled")
Catch ex As System.Net.Sockets.SocketException
MsgBox("The xxxxx Server is unavailable, contact the System Administrator.", MsgBoxStyle.Exclamation, "Server Unavailable")
End Try
Else
MsgBox("User not authenticated, the application will terminate.", MsgBoxStyle.Exclamation, "Authentication")
End If
My.Settings.Save()
Application.Exit()
End Sub
End Class
答案 3 :(得分:0)
我建议实施健康监测。最好有一个您可能能够预测和控制的异常日志,但是您可以使用内置的运行状况监视框架来配置应用程序以捕获无关的异常。