cflocation不再适用于CF10

时间:2013-10-17 01:32:35

标签: coldfusion cfml cflocation

自从我从CF9升级到CF10以来,我一直在与cflocation的一个错误作斗争。我已经多次努力但总是放弃,但今天它终于让我感到烦恼,是时候解决问题了(我希望)。

首先,道歉,因为我试图编写一个简单的测试用例来重现这个问题,但到目前为止,我一直无法在原始代码之外重现它。

我有一个应该在一夜之间运行的多步导入过程。该过程由大约10个链接在一起的文件组成。通过计划任务调用进程时,还会传递URL参数(scheduledtask)。如果参数不存在,则在每个步骤结束时它将停止并等待用户单击指向下一步的链接。如果参数确实存在,则使用cflocation进入下一步。

在所有步骤中,第二步是最复杂和最耗时的(来自多个Web服务请求的数据,然后需要加入,清理和插入数据库)。这是第二步,在转向CF10后出现问题。页面似乎工作正常,因为它到达cflocation标记的页面的最底部,但它永远不会触发cflocation。我已经添加了一个cfmail标签给我发电子邮件,因为正在调用cflocation,它总是被发送,但cflocation再次没有被激活。

它不能比以下更基本:

<cfif scheduledtask EQ "true">
   <cfmail from="xxxxx” to="xxxx” subject="About to call duplicate" type="text/html"> 
      <p>calling duplicate check - scheduledtask</p>
   </cfmail>

   <cflocation url="importDupCheck.cfm?scheduledtask=true" addtoken="false">
</cfif>

我知道cfflush和cflocation存在问题,我已经检查过了。

作为测试,我尝试将上述逻辑向上移动到web服务检索所有数据之后但在处理之前,这次cflocation工作。我想也许这是一个超时问题,即使页面被允许完全加载,计划任务引擎已经放弃了等待。我试过通过一个基本文件来测试这个:

<cfset sleep(240000)>
 * 4 minutes

在它调用cflocation之前,但它工作正常。

该过程中的其他步骤正如预期的那样使用cflocation工作,而不是这个。所有这些代码在CF9下运行正常,只是CF10失败了。

有没有人对我应该看的地方有一些指示?

此致 标记


*更新 * 所以我现在已经研究出如何在几行代码中轻松地重现这一点。事实证明它与计划任务无关。

index.cfm

<h1>Testing cflocation</h1>

<cfloop index="i" from="1" to="7000" ><!--- For me it stops working once the loop goes beyond 6808 rows --->
    row <cfoutput>#i#</cfoutput>: abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789<br/>
</cfloop>

<p>Now loading resultpage via cflocation</p>
<cflocation url="resultpage.cfm" addtoken="false">

resultpage.cfm

<h1>Made it!</h1>
<p>Reload the <a href="index.cfm">first page</a></p>

在我的测试中,我发现如果我循环6808次它有效,但是6809次失败。有7000条记录,我们只讨论一个36 KB的文件...。为什么这只在CF10中失败?

我应该注意的最后一点是,如果它有影响 - 我所做的一切都是通过https完成的。

4 个答案:

答案 0 :(得分:3)

好的我已经解决了

在CF管理员中

最大输出缓冲区大小1024

之后将发生冲洗,这将停止cflocation工作。

增加它并且它有效。

答案 1 :(得分:2)

我不知道为什么你的代码不起作用,我很害怕。据猜测,这取决于ColdFusion 10对计划任务引擎的替换,并且它不喜欢一些变幻莫测的客户端重定向。

然而,无论如何你可以绕过这种情况。

ColdFusion 10的调度程序具有链接任务的概念,因此当任务完成时,另一个任务将被启动。你可以想象修改你的调度程序来改变它吗?

答案 2 :(得分:1)

我遇到了类似的问题,但我在cfscript中使用了location()函数。但我怀疑同样的原则适用。

在location()函数之前,我们调用的函数没有包含在<cfsilent>标记中。结果,函数的每一行(包括循环)都作为空行输出。当我查看源代码时,有超过20,000行空HTML代码。这可能足以达到1024 kb缓冲区限制并触发中止重定向的刷新。

通过向自定义函数添加<cfsilent>标记,我将HTML的空行数减少到39,现在location()函数按预期工作。

要确定这是否是您遇到的问题,请添加中止; (或<cfabort>)就在location()之前,然后查看结果的源代码 - 可能是空页面。

答案 3 :(得分:0)

您是否尝试在CFABORT之后添加CFLOCATION?这就是我经常做的事 - 因为CFLOCATION之后的代码不应该被执行。

如果您检查来自服务器的响应(使用Charles代理,Fiddler或类似的东西),您可能会在HTML / JS中发现阻止重定向的内容。