【问题标题】:ColdFusion - CFThread Failed to Set Header?ColdFusion - CFThread 无法设置标题?
【发布时间】:2013-07-16 04:05:13
【问题描述】:

我从 CFThread 收到一个奇怪的错误。我将它包裹在一个在 CFThread 之外可以完美运行的函数上。但是,它需要大约 20 秒才能完成,所以我将其发送到 CFThread,然后 CFLocation 将用户转到一个新页面,并在完成时提醒他们。

它也包含在 CFTRY 中,如果有问题可以给我发电子邮件。

我收到了 CFCATCH.Message 所在的电子邮件:

“CFThread 未能设置响应头,因为请求已经完成”

我在 Google 上找不到对此类错误的任何引用。我假设它不喜欢我在调用线程后直接使用 CFLocation 的事实。所以,为了它,我尝试使用 META REFRESH 来重定向用户。同样的错误结果。

有什么想法吗?

2013 年 7 月 8 日更新:

代码在这里:

<cfset admsID = replace(createUUID(),"-","","all")>
<cfthread action="run" name="runADMS#admsID#" admsID="#admsID#" formstruct="#form#">
<cftry> 
<cfobject component="cfc.AutoDealerBrandMarketShare" name="adms">
<cfset rptPDF = adms.buildReport(dealer=formstruct.chosenDealer,mkt=formstruct.DMACode,make=formstruct.Make,rptID=admsID)>
<cfcatch type="any">
<cfmail to="pmascari@mysite.com" from="techsupport@mysite.com" subject="ADMS Error">
Error occurred running a Polk Auto Dealer Market Share report.
#cfcatch.Message#
#cfcatch.detail#
</cfmail>
</cfcatch>
</cftry>
</cfthread> 
<cflocation url="http://www.usercanwaithere.com">

【问题讨论】:

  • 您能否发布一些代码,以便我们自己重现该问题?
  • 另外,请查看 CF 生成的异常日志,因为这可能会指向一行代码。此外,使用 Fiddler 或 Chrome 开发工具,在 CFTHREAD 之外运行函数时查看 HTTP 响应,看看是否设置了任何其他标头
  • 我用代码更新了帖子。我还查看了日志,找不到任何与此错误相关的内容。
  • cflocation 仅在代码中的线程之后 - 线程与它异步运行(并且可能在它执行后完成,因此在响应被发回之后);这是无关紧要的,不是原因。
  • 错误信息非常明确,似乎是 Henry 所说的,所以请查看 buildReport 内部 - 它将包含(或调用其他包含)cfheader 或其他 cflocation 的代码尝试设置 HTTP 标头的其他等效构造。

标签: coldfusion header response cfthread


【解决方案1】:

如果您考虑一下,这是有道理的,因为 cfthread 在响应发送到客户端之后仍然可以运行。因此,在标题中设置新内容不再有意义,因为“船已经航行了”。

如您所知,CFThread 允许您生成一个新线程来做一些事情 与请求并行处理。这个话题可以继续 即使在请求完成后运行。由于这个线程不是 连接到产生它的 HTTP 请求,任何操作从 尝试更改 HTTP 中的某些内容的线程 请求/响应 - 比如设置标头、cookie、响应代码等 没有意义,也不应该这样做。

所以不要在里面使用 cfcookie、cfheader、cfcontent 等 cfthread,因为它可能导致不可预知的行为。

-- Rupesh Kumar, Adobe ColdFusion engineer

【讨论】:

  • 用代码更新了帖子。要清楚...线程中的代码只是创建一个 PDF 并将其保存到服务器。它根本不打算与浏览器交互。我在日志中看不到有关此错误的任何内容
  • “它根本不打算与浏览器交互” - 但错误表明它正在尝试这样做。既然您说它正在保存 PDF(该信息应该在问题中),因此如果某处存在(不正确/不必要的)cfcontent,我不会感到惊讶。
  • 找到了。浏览代码,在其中一个 CFDocument 标记上方发现了一个随机的 CFHEADER 标记。
  • @PaulMascari 很好,请将此标记为正确答案。 :) 谢谢
【解决方案2】:

找到了。浏览代码,在其中一个 CFDocument 标记上方发现了一个随机的 CFHEADER 标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 2017-09-23
    相关资源
    最近更新 更多