我有一个我用一些业务逻辑创建的库,包括写入System.Diagnostics.EventLog
实例。该库通常从Windows服务应用程序调用,但现在我正在尝试从我的ASP.NET MVC应用程序调用这些相同的库函数。
我在我的控制器中尝试了这个代码,以创建我传递给需要写入日志的方法的EventLog实例。
Dim log = New EventLog("Application", My.Computer.Name, "MyMVCApp")
当库方法中的代码尝试写入日志时,会生成以下错误:
[SecurityException: Requested registry access is not allowed.]
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) +366
System.Diagnostics.EventLog.VerifyAndCreateSource(String sourceName, String currentMachineName) +194
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type, Int32 eventID, Int16 category, Byte[] rawData) +205
System.Diagnostics.EventLog.WriteEntry(String message, EventLogEntryType type) +14
我的网络应用程序在运行IIS 6的Windows Server 2003上作为网络服务用户运行。为了让网络服务用户能够访问注册表,我需要做些什么吗?
有没有更好的方法来创建用于ASP.NET MVC应用程序的EventLog实例?是否已经由我需要引用的框架创建了一个?
答案 0 :(得分:19)
来自MSDN:“使用网络服务标识运行的应用程序可以使用现有事件源写入事件日志,但无法创建新事件来源,因为注册表权限不足。“
和...
“如果与EventLog实例关联的事件日志的源不存在,则会创建一个新的事件源。”
所以看起来您的事件日志源不存在,并且它正在尝试使用网络服务用户创建新的事件日志源(这需要写入注册表,因此无法工作)。
“要使您的ASP.NET应用程序使用尚不存在的事件源写入事件日志,您有两个选择:”
因此,需要在应用程序之外创建日志(不能以此用户编程方式执行。手动执行,或创建简单的命令行应用程序以简化安装)。
详细信息:
http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess
我个人建议您不要更改网络用户权限,而是在网络应用程序之外创建日志源。我的偏好是在一个控制台应用程序中(这将花费你大约5分钟来编写,你也可以用来准备其他机器)。在VS.NET中启动一个新的控制台应用程序,并添加代码以创建日志源。一个例子:
http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx
然后只需使用适当的权限登录,就可以从cmd行运行控制台应用。
答案 1 :(得分:5)
如果你不确定它想要创建什么样的事件来源,那么上面接受的答案将难以理解。
更简单的解决方案是将应用程序池切换为临时使用LocalSystem,然后运行应用程序并产生错误。它将能够创建相关的事件日志源,之后您可以将其切换回使用NetworkService。
答案 2 :(得分:0)
我不知道为什么你不能创建自己的EventLog而不是写在应用程序日志上。
您可以使用以下代码创建窗口/控制台应用程序并以管理员身份运行它,这将为您创建一个新日志。
if (!EventLog.Exists("LOG_NAME"))
EventLog.CreateEventSource("LOG_NAME", "LOG_NAME");
这将在事件日志中创建一个新的日志,并在应用程序和服务日志中可见。
if (!EventLog.SourceExists("MyMVCApp"))
EventLog.CreateEventSource("MyMVCApp", "LOG_NAME");
这将在自定义" LOG_NAME"内创建一个新的来源。你可以使用代码
Dim log = New EventLog("LOG_NAME", My.Computer.Name, "MyMVCApp")
创建自定义日志。