Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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