我正在运行ColdFusion 9,0,1,274733,并在带有IIS的Windows 2008 Server 64位上应用了修补程序2。
我编写了一个cfc来处理数据库表的日志记录(用户审计)。基本上我在请求周期中的不同点称这个cfc。应用程序启动时,请求结束时,应用程序结束时以及发生错误时。在应用程序到期之前,这一切都非常有效。
以下是我的Application.cfc中的一些相关部分。 我正在定义一个映射到cfc在任何cffunction之外的位置,如下所示:
this.versionfolder="version1";
this.mappings["/modules"]="C:\Webroot\folder\#this.versionfolder#";
然后在前面提到的应用程序事件中,我可以这样调用我的日志记录cfc:
<cfinvoke component="/modules/LogIt" method="Store" />
这适用于应用程序到期之前。当代码在OnApplicationEnd方法中为日志记录模块触发我的cfinvoke时,我收到此错误:
Message: Could not find the ColdFusion component or interface /modules/LogIt.
Detail: Ensure that the name is correct and that the component or interface exists.
我知道cfc存在它在整个应用程序的生命周期中一直以同样的方式调用它。有没有人看到过这种行为?
要解决此问题,我遇到此问题的应用程序位于Web根目录中。我有另一个应用程序,在同一台服务器上运行,它位于此应用程序的子文件夹中(它们具有不同的应用程序名称)。我在Application.cfc中使用完全相同的逻辑,通过该应用程序的映射引用相同的日志记录cfc,它在应用程序端正常工作。我很难过,并且无法在网上找到有关此特定情况的任何信息。
要清楚,每次在应用程序结束时,我在Web根目录中的应用程序都会失败。我在子文件夹中的应用程序每次都有效。不确定这是否相关,但是在子文件夹应用程序之前启动(访问)Web根应用程序。虽然我已经测试过只能访问Web根应用程序,但它仍然失败。我也尝试使用点符号作为组件名称,但它仍然失败。
答案 0 :(得分:0)
onApplicationEnd在应用程序结束后触发,因此应用程序范围不再可用。 由于您的子应用程序在其onApplicationEnd方法触发时位于子文件夹中,因此仍可以访问其父应用程序范围。
Use the ApplicationScope parameter to access the application scope; you cannot reference the scope directly; for example, use Arguments.ApplicationScope.myVariable, not Application.myVariable.
- docs
答案 1 :(得分:0)
我刚刚做了一些研究,因为我发现了another question here asking much the same thing。
My findings有一个但是在CF8-10中导致Application.cfc-set映射在onApplicationEnd()中不起作用(在CF8中也不在onSessionEnd()中)。解决方法是在CFAdmin中设置映射。我担心的不是一种解决方法。