C# &引用;句柄无效";使用ASP.NET写入事件日志时出错

C# &引用;句柄无效";使用ASP.NET写入事件日志时出错,c#,asp.net,active-directory,event-log,C#,Asp.net,Active Directory,Event Log,我正在使用ASP.NET 2.0应用程序(由我的前任创建)。用户使用广告凭据登录,应用程序中的所有操作都使用这些凭据。我在应用程序中修改了一个与事件日志无关的页面,现在我的用户收到了以下错误: 以下是global.asax文件中的相关代码: public void LogException(Exception e) { string exceptionXml = RenderException(e, true); _EventLog.WriteEntr

我正在使用ASP.NET 2.0应用程序(由我的前任创建)。用户使用广告凭据登录,应用程序中的所有操作都使用这些凭据。我在应用程序中修改了一个与事件日志无关的页面,现在我的用户收到了以下错误:

以下是global.asax文件中的相关代码:

public void LogException(Exception e)
    {
        string exceptionXml = RenderException(e, true);

        _EventLog.WriteEntry("Exception of type " + e.GetType().FullName + " occurred.\n\n" + exceptionXml, EventLogEntryType.Error);
    }
RenderException()只是将异常XML放入一个简单的字符串中,删除空格


我不知道如何消除这个错误。我试着用iisreset重新发布网站。我尝试重新启动web服务器(2k3 w/iis 6.0),刷新应用程序池。我还尝试在注册表中修改顶级事件日志项的权限。有人能告诉我如何摆脱这个错误吗?这不会发生在我的电脑上,所以很难复制。此外,使用的浏览器似乎并不重要。以前的版本适用于出现此错误的相同人员

默认情况下,ASPNET用户无法访问现有的事件日志类别

如果要将消息写入事件日志,则必须创建自己的类别

  • 启动RegEdit
  • 导航至HKEY_本地_机器\系统\ CurrentControlSet\Services\EventLog\
  • 从菜单中,选择编辑->权限
  • 单击Add按钮并写入ASPNET。(如果ASP.NET以其他用户id运行,请改用该id)
  • 单击“确定”
  • 从列表中选择新添加的用户(默认情况下为ASP.NET计算机用户)
  • 单击“允许”列中的“完全控制”
  • 单击“确定”
  • 您还可以检查运行应用程序的用户是否属于正确的组,例如IIS\u WPG


    您似乎在调用
    \u EventLog
    实例上的EventLog类的实例方法:

    _EvengLog.WriteEvent(message, ...);
    
    但是:

    任何实例成员都不能保证线程安全

    我怀疑这可能是问题的根源,建议您使用一种静态方法(保证线程安全):


    或者,您也可以实现自己的同步,但我不建议这样做。

    仅供参考“请注意,您可以随时对自己的帖子和问题的任何部分发表评论。但是,评论其他人的帖子是一种特权。”通过感谢,我没有意识到这一点!我将编辑此免责声明。我可能没有说得足够清楚,但我已经尝试过此操作(“我还尝试过修改注册表中顶级事件日志项的权限”)。我确保intranet组中的所有用户(他们需要这个来访问站点)完全控制顶级事件日志键。除非我错过了一些不起作用的东西(比如重启后…@Heytherlameman我刚刚添加了更多信息,可能会对您有所帮助。我能够在我的生产服务器上实现这一点。我的用户仍然会收到此错误,但我不会。这是非常零星的。它也有相同的堆栈跟踪,所以我认为这个问题没有解决。我是否需要在用户机器上进行某种刷新以使其正常工作?@Heytherlameman-我仍然认为这个错误很可能是由于线程问题造成的。您应该检查整个代码库是否存在这样的线程问题。
    System.Diagnostics.EventLog.WriteEvent(source, message, ...);