这是一个奇怪的。我没有任何运气在谷歌上找到任何关于此的信息,所以我想知道你们中是否有人以前见过这个?
我在请求范围内有一个 CFC,然后在 onRequestEnd 事件中,我将该 CFC 从请求范围中取出并用它做一些请求结束的事情。问题是我无法在我的 onRequestEnd 事件中引用该变量,因为它会产生一个错误,指出它没有在范围内定义......但这就是它变得非常奇怪的地方以及为什么我知道这是一个错误(它不仅仅是一个怀疑)...如果我 DUMP 变量,cfdump 标记成功显示 CFC 及其所有内容...然后产生相同的“在范围内未定义”错误。这是一个屏幕截图。
所以……有人见过这个吗?因为我完全被难住了。我已经安装了 9.0.1 更新程序和两个累积修补程序。
ps 是的,我知道它说的是 OnRequestEnd.cfm,但这实际上是在 Application.cfc 的 onRequestEnd 方法中——它是最初可追溯到 CF5 的框架的遗留物,随它去吧。;P
编辑:好的,它变得更奇怪了......我尝试使用评估()将其设置为一个局部变量,这显然有效,因为然后我转储了局部变量。转储仍然有效,即使它位于发生错误的行之后的第 2 行?!!
编辑 2: 编辑:这是 Application.cfc 中的代码,其中包括发生错误的文件:
<cffunction name="onRequestEnd" access="public" output="true">
<cfinclude template="OnRequestEnd.cfm">
</cffunction>
它似乎与方法和包含文件的组合有关。
如果我像这样执行 onRequestStart 中的方法,它仍然会失败:
<cffunction name="onRequestStart" access="public" output="true">
<cfset onRequestEnd() />
</cffunction>
但是如果我像这样将文件包含在 onRequestStart 中,它工作正常。
<cffunction name="onRequestStart" access="public" output="true">
<cfinclude template="OnRequestEnd.cfm">
</cffunction>
然而!显然还有更多,因为我无法创建一个简单的测试用例。如果我创建一个包含非常简单的 application.cfc 的新项目并复制所有这些细节,它就可以正常工作。因此,除了方法名和文件名之外,框架中还有其他东西对其做出了贡献。
而且文件名似乎并没有真正起作用,因为如果我像这样更改文件名,它仍然会以同样的方式失败:
<cffunction name="onRequestEnd" access="public" output="true">
<cfinclude template="reqend.cfm">
</cffunction>
编辑3:好的,它与文件无关......它确实如此,但与文件名无关......在onRequestEnd.cfm的底部是这段代码
<!--- this seems to help resolve a leaky-memory issue in CF/JRun --->
<cfset structClear(variables) />
<cfset structClear(request) />
<cfabort />
如果我注释掉那些 StructClear 语句,那么错误就会消失,这告诉我它正在执行 OnRequestEnd.cfm 两次......我认为这意味着 CF9 改变了 CFABORT 标记的行为,它现在执行 onRequestEnd 事件当标签被使用时......它在以前版本的cf中没有......
我没有找到这方面的文档,但我确实找到了 Ben Nadel的这篇关于 CFLOCATION 标签行为的博客,所以它似乎更普遍地是关于 onRequestEnd 事件。现在似乎在 CF9 中,无论页面如何完成执行,onRequestEnd 事件都会在最后执行......这是对所有以前版本的更改,因此它与我创建的代码混在一起,以便实际导致这种情况发生在以前的版本上。由于我导致执行 onRequestEnd 然后提前中止页面,CF 现在执行 onRequestEnd,中止,然后由于中止再次执行 onRequestEnd。
幸运的是,模板顶部的这段相当简单的代码似乎解决了这个问题:
<cfif structIsEmpty(request)>
<cfexit method="exittemplate" />
</cfif>