来自cfc - cflocation的抛出错误不能从内部onerror()

时间:2012-01-27 20:12:01

标签: coldfusion cfc onerror

编辑:一个重要的部分可能是我通过ajax调用cfc方法......

我通过ajax调用cfc方法,该方法返回用于jqgrid表的数据。在cfc的方法中,我正在尝试设置错误处理,这样我就可以将用户发送到错误页面,在根目录中定义为error.cfm,而不是仅仅失败并且不向用户提供任何问题的指示。 ,现在只包括一些样板html。 在Application.cfc中,我已经定义了我的onError()方法,如下所示:

<cffunction name="onError" returnType="void" output="false"  >
    <cfargument name="exception" required="true"  >
    <cfargument name="eventname" type="string" required="true"  >

    <cfmail to="#application.REGISTRATION_NOTIFICATION#" from="outgoing address" subject="Error">

    </cfmail>

    <cflocation url="../index.cfm?file=error.cfm" addToken="false"  /> 

当我从cfc的方法中抛出一个错误时,无论是否在cfcatch内部,Chrome报告我确实已经发送到index.cfm并且STATUS = 200,并且响应正确显示了里面的html error.cfm模板。但是,浏览器实际上并未转到该页面。

问题是,如果我将位置更改为

<cflocation url="index.cfm?file=error.cfm" addToken="false"  /> 

并从调用cfc的页面抛出错误,而不是从cfc,cflocation按预期工作。此外,如果我使用cfinvoke从原始页面调用cfc,而不是使用ajax调用,cflocation工作。所以这必须与我通过ajax调用cfc而不是从CF中调用它的事实有关。那我在这里错过了什么?

P.S。这种情况发生在Chrome,IE和FF中。我正在使用带有修补程序的CF 9.0.1,没有框架。以下是Chrome网络主题窗格输出的子集,位于标题中,用于引用页面:

  

请求网址:http://localhost/sitename/cfc/method.cfc

     

请求方法:GET

     

状态代码:302暂时移动

     

请求标题查看来源

     

接受:application / json,text / javascript, / ; Q = 0.01

     

接收字符集:ISO-8859-1,utf-8; Q = 0.7,*; Q = 0.3

     

接受编码:gzip,放气,SDCH

     

接受语言:EN-US,EN; Q = 0.8

     

连接:保活

     

的Cookie:CFID = 11801; CFTOKEN = 90037336; LASTVISIT = 1327852981759

     

主机:本地主机

     

的Referer:HTTP://localhost/sitename/index.cfm FILE = referringfile.cfm

     

User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 535.7   (KHTML,像Gecko一样)Chrome / 16.0.912.77 Safari / 535.7

     

X-请求-随着:XMLHttpRequest的

     

查询字符串参数视图URL编码

     

方法:getPartNumbers

     

过滤器:{ “网页”:1, “sessionSQL”: “1327834969791”, “filterRows”:[{ “FIELD_NAME”: “PART_NUMBER”, “操作数”: “等于”, “FIELD_VALUE”:“11   06 01“}]}

     

_search:假

     

ND:1327835014639

     

行:100

     

页面:1

     

SIDX:PART_NUMBER

     

SORD:降序

     

响应标头查看源

     

的Content-Type:text / html的;字符集= UTF-8

     

日期:太阳,2012年1月29日11:03:34 GMT

     

地点:../ index.cfm FILE = error.cfm

     

持久-AUTH:真

     

服务器:IIS / 7.5

     

Set-Cookie:LASTVISIT = 1327853014657; expires = Fri,27-Jul-2012 11:03:34   GMT;路径= /

     

传送编码:分块

     

X供电-通过:ASP.NET

对于error.cfm页面:

  

请求网址:http://localhost/sitename/index.cfm?file = error.cfm

     

请求方法:GET

     

状态代码:200 OK

     

请求标题查看来源

     

接受:application / json,text / javascript, / ; Q = 0.01

     

接收字符集:ISO-8859-1,utf-8; Q = 0.7,*; Q = 0.3

     

Accept-Encoding:gzip,deflate,sdch

     

接受语言:EN-US,EN; Q = 0.8

     

授权:协商   blahblahblahblah

     

连接:保持活力

     

的Cookie:CFID = 11801; CFTOKEN = 90037336; LASTVISIT = 1327716554490

     

主机:本地主机

     

的Referer:HTTP://localhost/sitename/index.cfm文件名= / filename.cfm&安培;配置文件名=

     

User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 535.7(KHTML,类似Gecko)Chrome / 16.0.912.77 Safari / 535.7

     

X-Requested-With:XMLHttpRequest

     

查询字符串参数视图URL编码

     

file:error.cfm

     

响应标头查看源

     

的Content-Type:text / html的; charset = UTF-8日期:星期五,2012年1月27日21:09:14

     

GMT Persistent-Auth:true服务器:Microsoft-IIS / 7.5

     

Set-Cookie:LASTVISIT = 1327716554533; expires = Wed,25-Jul-2012 21:09:14 GMT; path = /

     

传送编码:分块

     

X供电-通过:ASP.NET

4 个答案:

答案 0 :(得分:0)

编辑:对不起,误读了这个问题......

更新:您可以尝试包含一个模板来处理cflocation,在application.cfc中执行cflocation可能会被禁止,因为它在请求被触发之前发生了吗?

的Application.cfc

 component {

    this.name = 'errorTest';

    public void function onError(required any Exception, required string EventName) {

        include 'errorRedirect.cfm';
    }
}

index.cfm(演示代码中有错误)

<cfscript>
a = form.nonExistentVariable;
</cfscript>

errorRedirect.cfm

<cflocation url="error.html">

的error.html

<h1>Sorry, An Error has Occurred. </h1>

test.cfc(使用test.cfc测试?method = test to demo cfc based error)

component {

remote function test () {

    a = form.DoesNotExist;
}
}

答案 1 :(得分:0)

答案 2 :(得分:0)

如果使用AJAX,则除非使用CF绑定到HTML文档中的HTML元素,否则不会显示结果输出。

在发出AJAX请求时,您是否可以使用chrome在响应正文(实体)中看到错误页面中的任何内容?

我认为这是一个Bluedragon应用服务器?

答案 3 :(得分:0)

我想我在这里得到了答案:

Handling Remote API Errors With Application.cfc's OnError Event Method

猜猜我知道足够多的Ajax是危险的:(

我认为让我感到震惊的是,我可以看到cflocation确实重定向到错误页面,我可以在网络窗格中看到正确的响应;但我没有意识到的是,由于我是远程调用该函数,浏览器实际上永远不会进入新窗口,相反,响应就在那里等待由ajax调用本身处理。我最终会想出这些东西。