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.
Public Class SampleBufferedEventProvider
Inherits BufferedWebEventProvider
' The local path of the file where
' to store event information.
Private logFilePath As String = String.Empty
' Holds custom information.
Private customInfo As New StringBuilder()
Private providerName, buffer, bufMode As String
' Initializes the provider.
Public Overrides Sub Initialize(ByVal name As String, 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))
End Sub '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.
Public Overrides Sub 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)
End If
End Sub '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.
Public Overrides Sub 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
For Each eventRaised In flushInfo.Events
customInfo.AppendLine(eventRaised.ToString())
Next eventRaised
' Store the information in the specified file.
StoreToFile(customInfo, logFilePath, FileMode.Append)
End Sub 'ProcessEventFlush
' Performs standard shutdown.
Public Overrides Sub Shutdown()
' Here you need the code that performs
' those tasks required before shutting
' down the provider.
' Flush the buffer, if needed.
Flush()
End Sub 'Shutdown
' Store event information in a local file.
Private Sub StoreToFile( _
ByVal [text] As StringBuilder, _
ByVal filePath As String, ByVal mode As FileMode)
Dim writeBlock As Integer
Dim startIndex As Integer
Try
writeBlock = 256
startIndex = 0
' Open or create the local file
' to store the event information.
Dim fs As New FileStream(filePath, mode, FileAccess.Write)
' Lock the file for writing.
fs.Lock(startIndex, writeBlock)
' Create a stream writer
Dim writer As 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 e As Exception
Throw New Exception("SampleEventProvider.StoreToFile: " + e.ToString())
End Try
End Sub 'StoreToFile
End Class 'SampleBufferedEventProvider
End Namespace
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.
public class SampleBufferedEventProvider :
BufferedWebEventProvider
{
// The local path of the file where
// to store event information.
private string logFilePath = string.Empty;
// Holds custom information.
private StringBuilder customInfo =
new StringBuilder();
private string providerName, buffer, bufferMode;
// Initializes the provider.
public override void 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.
public override void 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.
public override void 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.
public override void 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.
private void 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)
{
throw new Exception(
"SampleEventProvider.StoreToFile: "
+ e.ToString());
}
}
}
}
See Also
Tasks
How to: Implement the Health Monitoring Custom Provider Example