更新:2007 年 11 月
本主题中的代码示例演示如何实现自定义的 ASP.NET 运行状况监视提供程序。有关如何使用此示例的详细信息以及到其他文件的链接,请参见如何:实现运行状况监视自定义提供程序示例。
示例
说明
下面的代码示例演示如何从 BufferedWebEventProvider 类进行派生,以创建将指定的运行状况监视事件信息写入本地文件的自定义提供程序。在您生成该示例之前,请更改 logFilePath = "C:\test\log.doc" 的赋值以便 logFilePath 变量指向您的程序具有写入和创建访问权限的文件夹。
代码
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());
            }
        }
    }
}