如何监视.Net服务器应用程序是否存在致命异常?

时间:2010-01-29 23:30:20

标签: .net email stack-overflow

我正在开发一个应该连续运行的.Net服务器应用程序。我希望每次服务器进程因任何原因终止时都会发送通知电子邮件。理想情况下,如果异常导致终止,则电子邮件应包含异常消息和堆栈跟踪。我知道无法捕获某些异常,例如StackOverflowException。那么如何记录/发送服务器进程中出现StackOverflowException的通知?

我正在考虑创建第二个进程来监视服务器进程。但是如何获得异常的细节呢?

4 个答案:

答案 0 :(得分:4)

诸如StackOverflowException之类的致命异常通常会导致Windows事件日志中的条目(甚至可能包括堆栈跟踪)。您可以监控您的事件日志(例如,使用其他服务),该日志将在某些条目上发送电子邮件。此处描述了用于监视事件日志条目的简单应用程序:

  

<强> A realtime event log monitoring tool

在这里:

  

<强> 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)

我建议实施健康监测。最好有一个您可能能够预测和控制的异常日志,但是您可以使用内置的运行状况监视框架来配置应用程序以捕获无关的异常。

http://msdn.microsoft.com/en-us/library/ms998306.aspx

http://www.4guysfromrolla.com/articles/031407-1.aspx