Custom ASP.NET Health Monitoring Provider Example

The code example in this topic demonstrates how to implement a custom ASP.NET health monitoring provider. For details about how to use this example and links to the other files, see How to: Implement the Health Monitoring Custom Provider Example.

Example

Description

The following code example shows how to derive from the BufferedWebEventProvider class to create a custom provider that writes specified health monitoring event information to a local file. Before you build the example, change the logFilePath = "C:\test\log.doc" assignment so that the logFilePath variable points to a folder for which your program has write and create access rights.

Code

Imports Microsoft.VisualBasic
Imports System
Imports System.Text
Imports System.IO
Imports System.Web.Management
Imports System.Collections.Generic
Imports System.Collections.Specialized
Imports System.Web


Namespace Samples.AspNet.Management

    ' Implements a custom event provider.PublicClass SampleBufferedEventProvider
        Inherits BufferedWebEventProvider

        ' The local path of the file where        ' to store event information.Private logFilePath AsString = String.Empty

        ' Holds custom information.Private customInfo AsNew StringBuilder()

        Private providerName, buffer, bufMode AsString


        ' Initializes the provider.PublicOverridesSub Initialize(ByVal name AsString, ByVal config As NameValueCollection)
            MyBase.Initialize(name, config)

            'Define the log local file location.
            logFilePath = "C:\test\log.doc"

            customInfo = New StringBuilder()

            providerName = name
            buffer = config.Get("buffer")
            bufMode = config.Get("bufferMode")

            customInfo.AppendLine( _
            String.Format("Provider name: {0}", providerName))
            customInfo.AppendLine( _
            String.Format("Buffering: {0}", buffer))
            customInfo.AppendLine( _
            String.Format("Buffering modality: {0}", BufferMode))
        EndSub 'Initialize




        ' Processes the incoming events.        ' This method performs custom processing and, if        ' buffering is enabled, it calls the base.ProcessEvent        ' to buffer the event information.PublicOverridesSub ProcessEvent( _
        ByVal eventRaised As WebBaseEvent)

            If UseBuffering Then                ' Buffering enabled, call the base event to                ' buffer event information.MyBase.ProcessEvent(eventRaised)
            Else                ' Buffering disabled, store event information                ' immediately.
                customInfo.AppendLine(String.Format( _
                "{0}", eventRaised.Message))
                ' Store the information in the specified file.
                StoreToFile(customInfo, logFilePath, FileMode.Append)
            EndIfEndSub 'ProcessEvent


        ' Processes the messages that have been buffered.        ' It is called by the ASP.NET when the flushing of         ' the buffer is required according to the parameters         ' defined in the <bufferModes> element of the         ' <healthMonitoring> configuration section.PublicOverridesSub ProcessEventFlush( _
        ByVal flushInfo As WebEventBufferFlushInfo)

            ' Customize event information to be logged. 
            customInfo.AppendLine( _
            "SampleEventLogWebEventProvider buffer flush.")

            customInfo.AppendLine(String.Format( _
            "NotificationType: {0}", flushInfo.NotificationType))

            customInfo.AppendLine(String.Format( _
            "EventsInBuffer: {0}", flushInfo.EventsInBuffer))

            customInfo.AppendLine(String.Format( _
            "EventsDiscardedSinceLastNotification: {0}", _
            flushInfo.EventsDiscardedSinceLastNotification))


            ' Read each buffered event and send it to the            ' Log.Dim eventRaised As WebBaseEvent
            ForEach eventRaised In flushInfo.Events
                customInfo.AppendLine(eventRaised.ToString())
            Next eventRaised
            ' Store the information in the specified file.
            StoreToFile(customInfo, logFilePath, FileMode.Append)

        EndSub 'ProcessEventFlush


        ' Performs standard shutdown.PublicOverridesSub Shutdown()
            ' Here you need the code that performs            ' those tasks required before shutting             ' down the provider.            ' Flush the buffer, if needed.
            Flush()
        EndSub 'Shutdown


        ' Store event information in a local file.PrivateSub StoreToFile( _
        ByVal [text] As StringBuilder, _
        ByVal filePath AsString, ByVal mode As FileMode)
            Dim writeBlock AsIntegerDim startIndex AsIntegerTry

                writeBlock = 256
                startIndex = 0

                ' Open or create the local file                 ' to store the event information.Dim fs AsNew FileStream(filePath, mode, FileAccess.Write)

                ' Lock the file for writing.
                fs.Lock(startIndex, writeBlock)

                ' Create a stream writerDim writer AsNew StreamWriter(fs)

                ' Set the file pointer to the current                 ' position to keep adding data to it.                 ' If you want to rewrite the file use                 ' the following statement instead.                ' writer.BaseStream.Seek (0, SeekOrigin.Begin);
                writer.BaseStream.Seek(0, SeekOrigin.Current)

                'If the file already exists it must not                 ' be write protected otherwise                  ' the following write operation fails silently.
                writer.Write([text].ToString())

                ' Update the underlying file
                writer.Flush()

                ' Unlock the file for other processes.
                fs.Unlock(startIndex, writeBlock)

                ' Close the stream writer and the underlying file     
                writer.Close()

                fs.Close()
            Catch e As Exception
                ThrowNew Exception("SampleEventProvider.StoreToFile: " + e.ToString())
            EndTryEndSub 'StoreToFile
    EndClass 'SampleBufferedEventProvider

EndNamespace
using System;
using System.Text;
using System.IO;
using System.Web.Management;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web;


namespace Samples.AspNet.Management
{
    // Implements a custom event provider.publicclass SampleBufferedEventProvider :
        BufferedWebEventProvider
    {

        // The local path of the file where// to store event information.privatestring logFilePath = string.Empty;

        // Holds custom information.private StringBuilder customInfo =
            new StringBuilder();

        privatestring providerName, buffer, bufferMode;


        // Initializes the provider.publicoverridevoid Initialize(string name,
         NameValueCollection config)
        {
            base.Initialize(name, config);

            logFilePath = @"C:\test\log.doc";

            customInfo = new StringBuilder();

            providerName = name;
            buffer = config.Get("buffer");
            bufferMode = config.Get("bufferMode");


            customInfo.AppendLine(string.Format(
                "Provider name: {0}", providerName));
            customInfo.AppendLine(string.Format(
                            "Buffering: {0}", buffer));
            customInfo.AppendLine(string.Format(
                            "Buffering modality: {0}", bufferMode));

        }


        // Processes the incoming events.// This method performs custom processing and, if// buffering is enabled, it calls the base.ProcessEvent// to buffer the event information.publicoverridevoid ProcessEvent(
            WebBaseEvent eventRaised)
        {

            if (UseBuffering)
                // Buffering enabled, call the base event to// buffer event information.base.ProcessEvent(eventRaised);
            else
            {
                // Buffering disabled, store event info// immediately.
                customInfo.AppendLine(string.Format(
                                   "{0}", eventRaised.Message));

                // Store the information in the specified file.
                StoreToFile(customInfo, logFilePath, FileMode.Append);

            }
        }

        // Processes the messages that have been buffered.// It is called by the ASP.NET when the flushing of // the buffer is required according to the parameters // defined in the <bufferModes> element of the // <healthMonitoring> configuration section.publicoverridevoid ProcessEventFlush(
            WebEventBufferFlushInfo flushInfo)
        {

            // Customize event information to be logged.
            customInfo.AppendLine(
                "SampleEventLogWebEventProvider buffer flush.");

            customInfo.AppendLine(
                string.Format("NotificationType: {0}",
                flushInfo.NotificationType));

            customInfo.AppendLine(
                string.Format("EventsInBuffer: {0}",
                flushInfo.EventsInBuffer));

            customInfo.AppendLine(
                string.Format("EventsDiscardedSinceLastNotification: {0}",
                flushInfo.EventsDiscardedSinceLastNotification));


            // Read each buffered event and send it to the// Log.foreach (WebBaseEvent eventRaised in flushInfo.Events)
                customInfo.AppendLine(eventRaised.ToString());

            // Store the information in the specified file.
            StoreToFile(customInfo, logFilePath, FileMode.Append);
        }

        // Performs standard shutdown.publicoverridevoid Shutdown()
        {
            // Here you need the code that performs// those tasks required before shutting // down the provider.// Flush the buffer, if needed.
            Flush();
        }

        // Store event information in a local file.privatevoid StoreToFile(StringBuilder text,
            string filePath, FileMode mode)
        {
            int writeBlock;
            int startIndex;

            try
            {

                writeBlock = 256;
                startIndex = 0;

                // Open or create the local file // to store the event information.
                FileStream fs = new FileStream(filePath,
                    mode, FileAccess.Write);

                // Lock the file for writing.
                fs.Lock(startIndex, writeBlock);

                // Create a stream writer
                StreamWriter writer = new StreamWriter(fs);

                // Set the file pointer to the current // position to keep adding data to it. // If you want to rewrite the file use // the following statement instead.// writer.BaseStream.Seek (0, SeekOrigin.Begin);
                writer.BaseStream.Seek(0, SeekOrigin.Current);

                //If the file already exists it must not // be write protected otherwise  // the following write operation fails silently.
                writer.Write(text.ToString());

                // Update the underlying file
                writer.Flush();

                // Unlock the file for other processes.
                fs.Unlock(startIndex, writeBlock);

                // Close the stream writer and the underlying file     
                writer.Close();

                fs.Close();
            }
            catch (Exception e)
            {
                thrownew Exception(
                    "SampleEventProvider.StoreToFile: "
                    + e.ToString());
            }
        }

    }

}

See Also

Tasks

How to: Implement the Health Monitoring Custom Provider Example