ColdFusion 10 REST API:返回文件时调用站点范围的错误处理程序(AbortException)

时间:2014-01-22 21:48:58

标签: api rest coldfusion coldfusion-10

我正在使用ColdFusion 10的新REST API。在其中一个端点,我正在返回一个这样的文件:

<cffunction name="getFil"
            access="remote"
            httpmethod="GET"
            restpath="{id}/fil"
            returntype="void">
    <cfargument name="id" required="true" restargsource="path" type="numeric" />

        <cfprocessingdirective suppresswhitespace="no">
            <cfheader name="Content-Disposition" value="attachment; filename=foo.pdf" />
            <cfheader name="Content-Type" value="application/pdf"> 
            <cfcontent file="C:/some_path_to_file/foo.pdf" deletefile="no" />
        </cfprocessingdirective>

</cffunction>

它工作正常并且响应200 OK,然后响应正文中的文件。即使响应正常,也会调用站点范围的错误处理程序,错误消息如下所示:

[coldfusion.runtime.AbortException : null] null <br>The error occurred on line 124.

客户端永远不会看到错误,但是当调用站点范围的错误处理程序时,我的电子邮件服务会向开发人员发送通知电子邮件。任何人都知道这个AbortException是什么以及如何防止它?

2 个答案:

答案 0 :(得分:1)

怀疑这种情况是停止处理的一些CFML标签(在这种情况下像<cfcontent>)似乎使用<cfabort>代码来执行此操作。我现在无法记住如何重新编写它,但是<cfabort>确实引发了一个异常(并且{和AbortException听起来正确),但ColdFusion在很大程度上抑制了它。 REST请求不使用与普通CF请求相同的servlet,所以它可能不太适合抑制它?

如果您(暂时用于测试目的)删除<cfcontent>,我预计不会发生异常。

我觉得我对这里的一些细节有点模糊,但我现在无法对它进行彻底的测试。对于那个很抱歉。当我找时间的时候,我会试着坚定起来并且听起来更明确。

答案 1 :(得分:1)

我无法与亚当的答案争辩,因为它似乎有道理。也许只是抓住那个特定错误(如果可以)并抑制电子邮件就足够了。但我做了一些搜索,可能会找到一种你可以尝试的不同方法。不使用<cfheader><cfcontent>标记,只需从服务中返回PDF的实际二进制数据。请参阅此博客文章:

CF html to pdf service - consume from node.js using rest api

不要担心node.js引用,因为给定的示例不使用它。他们只是链接到node.js示例。

在他们的示例中,他们将数据传递给服务,但是您应该轻而易举地阅读PDF文件并返回该数据。