使用ASP.NET写入事件日志时“句柄无效”错误

时间:2013-08-26 16:55:12

标签: c# asp.net active-directory event-log

我正在使用ASP.NET 2.0应用程序(由我的前任创建)。用户使用AD凭据登录,并且应用程序内完成的所有内容都使用这些凭据。我在应用程序中修改了与事件记录无关的页面,现在我的用户收到此错误: Handle is invalid error

以下是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),刷新应用程序池。我还尝试在注册表中修改顶级事件日志键的权限。谁能告诉我如何摆脱这个错误?它不会发生在我的电脑上,因此很难复制。此外,使用的浏览器似乎并不重要。以前的版本适用于遇到此错误的相同人员。

2 个答案:

答案 0 :(得分:0)

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

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

  1. 启动RegEdit
  2. 导航至HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志\
  3. 从菜单中选择编辑 - >权限
  4. 单击“添加”按钮并编写ASPNET。 (如果ASP.NET在不同的用户ID下运行,请改用该ID)
  5. 单击“确定”。
  6. 从列表中选择新添加的用户(默认情况下为“ASP.NET计算机用户”)。
  7. 单击“允许”列中的“完全控制”。
  8. 单击“确定”。
  9. 您还可以检查运行应用程序的用户是否属于正确的组,例如 IIS_WPG

    <强> http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/3648346f-e4f5-474b-86c7-5a86e85fa1ff.mspx?mfr=true

答案 1 :(得分:0)

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

_EvengLog.WriteEvent(message, ...);

但是according to MSDN documentation for the EventLog class

  

不保证所有实例成员都是线程安全的。

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

System.Diagnostics.EventLog.WriteEvent(source, message, ...);

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