0

我正在运行 ColdFusion 9,0,1,274733,并在带有 IIS 的 64 位 Windows 2008 Server 上应用了修补程序 2。

我编写了一个 cfc 来处理数据库表的日志记录(用户审计)。基本上,我在请求周期的不同时间点调用了这个 cfc。在应用程序启动时、请求结束时、应用程序结束时以及发生错误时。在应用程序到期之前,这一切都运行良好。

下面是我的 Application.cfc 中的一些相关部分。我正在定义到任何 cffunction 之外的 cfc 位置的映射,如下所示:

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 根应用程序,但它仍然失败。我也尝试过对组件名称使用点表示法,但它仍然失败。

4

2 回答 2

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.-文档

于 2012-09-06T13:10:25.547 回答
0

我只是对此进行了一些研究,因为我在这里发现了另一个问题,问的问题大致相同

My findings were that there's a but in CF8-10 that result in Application.cfc-set mappings do not work in onApplicationEnd() (nor indeed in onSessionEnd() in CF8). the work around is to set the mappings in CFAdmin. Not much of a workaround, I'm afraid.

于 2012-11-03T22:01:57.307 回答