这是一个奇怪的。我没有在Google上找到任何有关此信息的运气,所以我想知道你们之前是否有人见过这个?
我在请求范围内有一个CFC,然后在onRequestEnd事件中,我从请求范围中获取了CFC并使用它执行了一些请求结束。问题是我无法在我的onRequestEnd事件中引用该变量,因为它会产生一个错误,表明它未在范围内定义...但是这里它变得非常奇怪,为什么我知道这是一个错误(它不仅仅是一个错误)怀疑)...如果我DUMP变量,cfdump标签成功显示CFC及其所有东西......然后生成相同的“范围内未定义”错误。这是一个屏幕截图。
所以......之前有人见过这个吗?因为我完全被难倒了。我已经安装了9.0.1更新程序和两个累积修补程序。
P.S。是的,我知道它说的是OnRequestEnd.cfm,但这实际上是在Application.cfc onRequestEnd方法中 - 它是从最初的CF5框架中遗留下来的遗产,只是随便去。 ; P
编辑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中没有...
我没有找到这方面的文档,但我确实找到了关于此行为的blog from Ben Nadel和CFLOCATION标记,所以它似乎更普遍地关于onRequestEnd事件。现在似乎在CF9中,无论页面如何完成执行,onRequestEnd事件都在最后执行...这是对所有先前版本的更改,因此它与我创建的代码相混淆,以便实际导致这种情况发生在以前的版本。由于我导致执行onRequestEnd然后提前中止页面,CF现在执行onRequestEnd,因为中止而中止并再次执行onRequestEnd。
幸运的是,模板顶部的这段相当简单的代码似乎解决了这个问题:
<cfif structIsEmpty(request)>
<cfexit method="exittemplate" />
</cfif>
答案 0 :(得分:0)
我决定在这里留下这个问题(而不是删除它),因为它可以帮助其他一些人,虽然我在处理一些评论时发现了问题的根源和解决方法,但这不是我们的想法。 Ben Nadel也在前一段时间posted a blog about the change to CFABORT ......而且Adam Cameron告诉我,虽然这个改变是在CF9中通过设计添加的(显然没有任何警告,因为我在LiveDocs中没有提及并添加了2条评论关于它,然后在(尚未发布?)CF10中删除它。我认为亚当可能处于测试阶段,我不确定。