1

这是一个奇怪的。我没有任何运气在谷歌上找到任何关于此的信息,所以我想知道你们中是否有人以前见过这个?

我在请求范围内有一个 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>
4

1 回答 1

0

我决定将这个问题留在这里(而不是删除它),因为它可能会帮助其他一些人,尽管我在处理一些评论时找到了问题的根源和解决方法,但这并不是我们的想法。Ben Nadel 不久前还发布了一篇关于 CFABORT 更改的博客……Adam Cameron 告诉我,虽然这种更改是在 CF9 中按设计添加的(显然没有警告任何人,因为我在 LiveDocs 和添加了 2 条关于它的评论),然后在(尚未发布?)CF10 中将其删除。我认为亚当可能处于测试阶段,我不确定。

于 2012-04-22T00:49:25.413 回答