【问题标题】:cflocation no longer working in CF10cflocation 不再在 CF10 中工作
【发布时间】:2013-10-17 01:32:34
【问题描述】:

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

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

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

结果页.cfm

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

在我的测试中,我发现如果我循环 6808 次它可以工作,但 6809 次失败。对于 7000 条记录,我们只讨论 36 KB 的文件……为什么这仅在 CF10 中失败?

我应该注意的最后一件事,以防它产生影响 - 我所做的一切都是通过 https 完成的。

【问题讨论】:

  • 我很惊讶cflocation 在作为计划任务运行时能正常工作。基本上它所做的只是将重定向标头发送回浏览器以请求后续页面。用于计划任务的“浏览器”相当有限。我没有任何参考资料,但我认为在计划任务中使用 cflocation 是不行的。我通常将.cfm 主页面用于我的计划任务,然后让它使用cfhttp 标记调用其他页面(URL)。这也允许对可能正在处理的不同 URL 设置不同的超时/错误处理。我猜它以前是否有效??
  • 嗨米格尔-F。我的假设是,计划任务的行为类似于 cfhttp,因为它像浏览器一样运行,因此它可以理解对 http 标头等的更改。除了它似乎以这种方式工作之外,没有什么可以支持这一点。无论如何,我已经更新了我原来的问题,因为它与计划任务无关。

标签: coldfusion cfml cflocation


【解决方案1】:

好的,我解决了

在 CF 管理员中

最大输出缓冲区大小 1024

之后将发生刷新,这将停止 cflocation 工作。

增加它就可以了。

【讨论】:

  • 谢谢戴尔。在我上面的测试用例中,它总共只生成了大约 770KB,所以我有点困惑为什么将缓冲区设置为高于 1024KB 有效,但它适用于测试用例。谢谢(也将在 cfaussie google 小组中感谢您)。
【解决方案2】:

恐怕我不知道您的代码为什么不起作用。猜测是因为 ColdFusion 10 替换了计划任务引擎,而且它不喜欢一些变幻莫测的客户端重定向。

但是,无论如何,您也许可以绕过这种情况。

ColdFusion 10 的调度程序具有链式任务的概念,因此当一个任务完成时,另一个任务会被启动。您可以修改您的调度程序以利用它吗?

【讨论】:

  • 我玩了一下午,我不再认为它与调度程序有关,因为我能够在我的浏览器中重现它。我真的很想知道为什么会发生这种情况,但是我发现在页面的下一部分,我正在循环一个数组,一旦它达到 80 个循环,代码底部的 cflocation 将不起作用。如果我在 79 条记录处退出循环,则 cflocation 有效。起初我认为可能是数据中的某些东西导致了问题……但使用不同的数据集,它会停止在 77 条记录。我要再玩一些,然后更新我的问题。这很奇怪。
  • 开个玩笑。你知道这是什么?阻止它的是页面的大小。当我循环数组时,它会为每条记录输出一行到浏览器。如果我删除输出,它运行良好。这很奇怪,因为即使它不遵循 cflocation 它仍然显示一切正常....只是不会遵循 cflocation (这是数组循环完成位置下方的 100 行代码)以及这 100 行中的所有内容显示正常。这让我对如何制作一些东西来演示这个问题有了一个想法。是吗?
  • 听起来 CF 正在将输出假脱机到浏览器。一旦发送了 HTTP 标头,就不能再执行 CFLOCATION 了,因为它是通过 HTTP 标头完成的。
  • 嗨,亚当,我已经更新了我原来的问题,加入了一种重现此问题的方法。为什么这会在 CF9 和 CF10 之间发生变化?
  • 哦!太美了!
【解决方案3】:

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

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

通过在自定义函数中添加&lt;cfsilent&gt;标签,我将HTML的空行数减少到39,现在location()函数可以正常工作了。

要确定这是否是您遇到的问题,请添加 abort; (或&lt;cfabort&gt;)就在location() 前面,然后查看生成的-可能是空的-页面的源代码。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 嗨 Lucas,我​​的理解是不需要 cfabort,因为 cflocation 几乎会在它被调用时停止处理(如果您有 OnRequestEnd() 则例外)。无论如何只是为了排除它,我确实尝试过,但没有任何区别。我设法缩小了让它工作和停止的范围(参见上面对亚当的评论),但这只是让问题变得更加奇怪。我将进行更多调查,以便将其记录下来,然后更新我的原始问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多