我有一个使用一些业务逻辑创建的库,包括写入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实例?是否有一个已经由框架创建,我只需要参考?
解决方法
从MSDN:“使用网络服务身份运行的应用程序可以使用现有的事件源写入事件日志,但由于注册表许可权不足,它们不能创建新的事件源”.
和…
“如果与EventLog实例关联的事件日志的源不存在,则会创建一个新的事件源.
所以看起来你的事件日志源不存在,它试图使用网络服务用户创建一个新的事件日志源(这需要写入注册表,所以不工作).
“要使您的ASP.NET应用程序使用不存在的事件源写入事件日志,您有两个选项:
>在应用程序安装时创建新的事件源
>在注册表中手动创建新的事件源条目.
因此,需要在应用程序之外创建日志(您无法使用此用户进行编程操作),手动进行操作,也可以创建简单的命令行应用程序来简化安装.
有关详细信息:
http://msdn.microsoft.com/en-us/library/ms998320.aspx#paght000015_eventlogaccess
就个人而言,我建议您不要更改网络用户权限,而是在Web应用程序之外创建日志源.我的偏好是在一个控制台应用程序(这将需要大约5分钟的写作,你还可以用来准备其他机器).在VS.NET中启动新的控制台应用程序,并添加代码来创建日志源.一个例子:
http://www.dotnetspider.com/resources/23593-Create-Event-log-VB-NET.aspx
然后从cmd行运行控制台应用程序,并以适当的权限登录.