12

我正在使用 VS2005 C# 2.0 和 SQL Server 2005。

我指的是有关配置健康监控的本指南。

在指南的最后,Default.aspx和按钮的on_Click 上会有一个按钮,一条新记录将插入到我的SQL 表中。

但是,当按下我的按钮时,表中没有插入任何记录。

我不确定错误是什么,因为没有显示错误消息,所以我想唯一的方法是反复试验我出错的地方。

PS我无法编译MyWebEvents类库,因为没有输出。在我的主 Web 应用程序中,我从MyWebEvents项目文件的bin文件夹中添加了引用 dll 。我引用的 DLL 是否可以使用,还是我在编译时遗漏了一个步骤?

以下是我运行的代码,参考微软网站:


MyCriticalEvent.csMyWebEvents类库中:

namespace MyWebEvents
{
public class MyCriticalEvent : WebAuditEvent
{
    private string userID;
    private string authType;
    private bool isAuthenticated;

    public MyCriticalEvent(string msg, object eventSource, int eventCode)
        : base(msg, eventSource, eventCode)
    {
        // Obtain the HTTP Context and store authentication details
        userID = HttpContext.Current.User.Identity.Name;
        authType = HttpContext.Current.User.Identity.AuthenticationType;
        isAuthenticated = HttpContext.Current.User.Identity.IsAuthenticated;
    }

    public MyCriticalEvent(string msg, object eventSource, int eventCode,
                           int eventDetailCode)
        : base(msg, eventSource, eventCode, eventDetailCode)
    {
        userID = HttpContext.Current.User.Identity.Name;
        authType = HttpContext.Current.User.Identity.AuthenticationType;
        isAuthenticated = HttpContext.Current.User.Identity.IsAuthenticated;
    }

    public override void FormatCustomEventDetails(WebEventFormatter formatter)
    {
        base.FormatCustomEventDetails(formatter);
        formatter.AppendLine("User ID: " + userID);
        formatter.AppendLine("Authentication Type: " + authType);
        formatter.AppendLine("User Authenticated: " +
                              isAuthenticated.ToString());
        formatter.AppendLine("Activity Description: Critical Operation");
    }
} 
}

Default.aspx.cs主 Web 应用程序中:

public partial class _Default : System.Web.UI.Page 
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
    MyCriticalEvent testEvent = new MyCriticalEvent(
                                    "Critical Operation Performed",
                                    this,
                                    WebEventCodes.WebExtendedBase + 1);
    testEvent.Raise();
}
}

Web.config主网络应用程序中:

<configuration>
    <appSettings/>
    <connectionStrings>
        <add name="MySqlConnection" connectionString="Data Source=<IP>;Initial Catalog=<DB NAME>;Persist Security Info=True;User ID=<admin username>;Password=<admin password>" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <system.web>
                <healthMonitoring enabled="true" heartbeatInterval="0">
        <bufferModes>
            <clear/>
            <add name="Logging" maxBufferSize="1000" maxFlushSize="200" urgentFlushThreshold="800" regularFlushInterval="00:05:00" urgentFlushInterval="00:01:00" maxBufferThreads="1"/>
        </bufferModes>
        <providers>
            <clear/>
            <add name="MySqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="MySqlConnection" maxEventDetailsLength="1073741823" buffer="true" bufferMode="Logging"/>
        </providers>
        <eventMappings>
            <clear/>
            <add name="All Audits" type="System.Web.Management.WebAuditEvent" startEventCode="0" endEventCode="2147483647"/>
            <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent" startEventCode="0" endEventCode="2147483647"/>
        </eventMappings>
        <profiles>
            <clear/>
            <add name="Audit Logs" minInstances="1" maxLimit="Infinite" minInterval="00:00:15"/>
            <add name="Error Logs" minInstances="1" maxLimit="Infinite" minInterval="00:00:15"/>
        </profiles>
        <rules>
            <clear/>
            <add name="All Audits Default" eventName="All Audits" provider="MySqlWebEventProvider" profile="Audit Logs"/>
            <add name="All Errors Default" eventName="All Errors" provider="MySqlWebEventProvider" profile="Error Logs"/>
        </rules>
    </healthMonitoring>
    </system.web>
</configuration>

在此处输入图像描述


我的数据库中的表:

在此处输入图像描述


如果 SQL 连接中断,则在事件日志中引发错误:

The following exception was thrown by the web event provider 'MySqlWebEventProvider' in the application '/TestLogSite' (in an application lifetime a maximum of one exception will be logged per provider instance):


问题摘要:单击 Default.aspx.cs 时button1中未插入任何日志记录aspnet_WebEvent_Event

我可以知道我的代码的哪一部分出错或遗漏了吗?

4

2 回答 2

3

如果您想立即看到它,请尝试禁用缓冲

<add name="MySqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="MySqlConnection" maxEventDetailsLength="1073741823" buffer="true" bufferMode="Logging"/>

改成

<add name="MySqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider" connectionStringName="MySqlConnection" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Logging"/>

这应该会停止由缓冲引起的延迟,并且您应该会立即看到行出现。

另外,您可能希望将配置文件上的 minInterval 减少到“00:00:01”之类的快速值:)

您可以在此处阅读有关缓冲的更多信息:

http://msdn.microsoft.com/en-us/library/ms178708%28v=vs.80%29.aspx

在实时系统上,最好保留缓冲,以防您认为 SQL 服务器可能因大量事件触发而过载。

或者

我发现我可以通过以下方式强制将其保存到日志中:

1:在 Visual Studio 中启动您的项目 2:单击按钮 3:停止项目,然后重新启动 4:检查数据库,您应该会看到记录的事件

于 2012-02-07T09:53:17.767 回答
2

尝试将 SqlWebEventProvider 暂时替换为TraceWebEventProvider以查看问题出在 ASP.NET WebEvents 中还是在访问 SQL 数据库中。

TraceWebEventProvider 应该避免与权限相关的问题。

更新

网络配置:

<system.web>
    ...
    <providers>
        <clear/>
            <add name="TraceEventProvider"
        type="System.Web.Management.TraceWebEventProvider, 
          System.Web"
        buffer="false"
        bufferMode=""
        maxEventLength="4096"
        maxSize="4096"
        maxMessagesPerNotification="1"
    />
    </providers>
    ...
    <rules>
        <clear/>
        <add name="All Audits Default" eventName="All Audits" provider="TraceEventProvider" profile="Audit Logs"/>
        <add name="All Errors Default" eventName="All Errors" provider="TraceEventProvider" profile="Error Logs"/>
    </rules>
    ...
</system.web>
...
于 2012-02-09T10:12:10.977 回答