编辑:一个重要的部分可能是我通过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
答案 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调用本身处理。我最终会想出这些东西。