2010-01-29 8 views
5

Je développe une application serveur .Net, qui est supposée fonctionner en continu. Je souhaite recevoir un e-mail de notification chaque fois que le processus du serveur est terminé pour une raison quelconque. Idéalement, le courriel devrait contenir le message d'exception et la pile si une exception a causé la résiliation. Je suis conscient que certaines exceptions ne peuvent pas être interceptées, telles que StackOverflowException. Alors, comment voulez-vous vous connecter/envoyer une notification qu'un StackOverflowException s'est produite dans le processus du serveur?Comment surveiller une application de serveur .Net pour des exceptions fatales?

Je pense à la création d'un second processus pour surveiller le processus du serveur. Mais comment cela se passerait-il les détails des exceptions?

Répondre

0

J'ai une application (code affiché) qui intercepte des exceptions non gérées et affiche une boîte de dialogue d'exception personnalisée, cela peut être utile?

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 
0

Je recommanderais de mettre en place un moniteur de santé. Il est bon d'avoir un journal des exceptions que vous pourriez anticiper et contrôler, mais vous pouvez configurer votre application pour intercepter les exceptions en utilisant le cadre de surveillance de la santé intégré.

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

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

+0

Merci, mais notre application n'est pas ASP.Net, seulement .Net. Nous n'avons même pas de Web.config où cela devrait être configuré – shojtsy

+0

@shotjsy: Peut-être quelque chose comme ça alors? http://www.codeproject.com/KB/exception/UnhandledExceptionClass.aspx –

4

exceptions fatales telles qu'un StackOverflowException entraîne généralement une entrée dans le journal des événements Windows (peut-être même y compris le stacktrace). Vous pouvez surveiller votre journal des événements (par exemple avec un autre service) qui enverra un e-mail sur certaines entrées. Une application simple pour l'événement de surveillance des entrées du journal est décrit ici:

A realtime event log monitoring tool

et ici:

Send email alerts when errors are written to the event log

Si vous voulez votre service doit être continuellement opérationnel et vous pouvez le configurer pour qu'il redémarre automatiquement en cas de panne (bien que vous sachiez que c'est généralement la raison pour laquelle il s'est écrasé et que le redémarrage ne supprime pas nécessairement cette raison). Vous pouvez le faire sur le Récupération sous les propriétés du service. Vous avez également la possibilité d'appeler un programme ou un script personnalisé en cas de panne de service.

Une autre option utilisant les fonctionnalités intégrées de Windows consiste à configurer le journal des événements pour envoyer une notification par courrier électronique. Cela fonctionne au moins à partir de Windows Vista, comme décrit ici:

How to Setup Event Viewer to Send a Email Notification in Vista

1

En fait, vous n'avez pas besoin de logiciel 3ème partie à tout faire - Win7 Planificateur de tâches peut tirer une tâche planifiée chaque fois qu'elle voit un certain type d'événement, et une exception non gérée est écrite dans le journal des événements.L'une des actions intégrées est "Envoyer un e-mail", de sorte que vous avez toute votre solution dans le système d'exploitation