Anthem.NET的 "Bad Response" 问题,及脚本调试技巧小结
这个问题产生的原因是,Anthem 在客户端 js 中调用服务器时,会返回一个表示 js 对象的文本,在得到后,通过 eval 方式将这个对象还原。其中包括了服务器需要返回给客户端的各种信息,比如脚本,更新的 html, ViewState 等。
如果这个 eval 出错,则会提示 'BADRESPONSE'.
通过查看页面输出可以看到:
JavaScript:
result.error = "NORESPONSE";
} else {
result.error = "BADRESPONSE";
result.responseText = responseText;
}
}
return result;
}
如何分析错误呢,很明显,我们只要看看 responseText 是什么,就会知道这个文本为什么不能被 eval 估算了。
因为 Anthem_GetResult 是由 Anthem 的 dll 动态输出的,我们需要修改这个函数的定义。
方法是在 </body> 前面,加一段代码来修改这个函数的定义即可:
JavaScript:
result.error = "NORESPONSE";
} else {
result.error = "BADRESPONSE";
result.responseText = responseText;
}
}
return result;
}
在正常情况下,alert 提示的信息如下:
---------------------------
确定
---------------------------
看上去有点乱,我们把它还原为正常的 js 代码,实际上是这样一个对象:
JavaScript:
},
"script": [
"window.location = 'http://www.sina.com.cn';"
]
}
其中 controls 是需要更新 innerHTML 的客户端控件集合,以及要更新的源代码。
Anthem.NET 修改了常见默认控件的 Render 方法,使控件输出的 HTML 外围多了一个容器控件. 而每次回调后,都会通过这个人为添加的容器来更新其中的控件 HTML 输出。
看如下 HTML:
HTML:
这段代码中,span 便是 LinkButton 的容器。
上述返回对象中的 script 属性,是在服务器端设定的,需要在返回后执行的脚本代码的集合。
服务器端可以通过下列语句来添加脚本:
C#:
以上分析的是 Anthem 在正常工作的情况下输出的对象,那么错误时会输出什么内容呢?下面是一个例子:
Microsoft Internet Explorer
---------------------------
<html> <head> <title>δʵ��÷������/title> <style> body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5p
我们看到其中有乱码信息,可以判断 Anthem 是遇到了编码问题导致输出错误了。
于是重新设定页面的编码,解决了这个问题。
分析一下 Anthem 的实现,可以看到 Anthem 在发送请求时的设定代码:
JavaScript:
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
x.setRequestHeader("Accept-Encoding", "gzip, deflate");
其默认请求编码是 utf-8 的。
而其输出编码,则可以通过 web.config 来定制。方法如下:
<system.web>
<appSettings>
<add key="Anthem.ResponseEncoding" value="gb2312" />
<add key="Anthem.ResponseType" value="gb2312" />
</appSettings>
</system.web>
</configuration>
这个办法是我通过分析 Anthem 的源码发现的,奇怪的是在其文档中好像没有发现相关的说明。
相关代码如下:
Manager.cs (C#):
string contentEncoding = null;
string contentType = null;
#if V2
contentEncoding = WebConfigurationManager.AppSettings["Anthem.ResponseEncoding"];
contentType = WebConfigurationManager.AppSettings["Anthem.ResponseType"];
#else
contentEncoding = ConfigurationSettings.AppSettings["Anthem.ResponseEncoding"];
contentType = ConfigurationSettings.AppSettings["Anthem.ResponseType"];
#endif
if (contentEncoding != null)
resp.ContentEncoding = Encoding.GetEncoding(contentEncoding);
if (contentType != null)
resp.ContentType = contentType;
resp.Cache.SetCacheability(HttpCacheability.NoCache);
}
小结一下使用 Anthem.NET 碰到脚本问题的查错方法:
首先定位到 Anthem.NET 产生的某个具体函数,然后,可以在页面的 </body> 前插入代码来改写该函数,在其中加入调试语句来定位问题。
当然,以上所说的是在部署服务器这种受限的环境下(通常没有开发环境)排错的方法,如果能够直接调试页面的 JavaScript 就更方便了。比如可以用 Visual Studio, 或者 MSE.exe 等工具来调试。
出处:http://www.cnblogs.com/RChen/archive/2006/12/16/anthem_debug1.html
Anthem.NET的 "Bad Response" 问题,及脚本调试技巧小结的更多相关文章
- shell脚本调试技巧
shell脚本调试之工具——bashdb http://www.cnblogs.com/itcomputer/p/5011845.html
- ASP.NET MVC bootstrap 3 ie 8兼容问题及错误解决(取消IE禁用IE脚本调试定位js文件错误)
因要做一个B/S架构的项目,使用MVC框架技术,本人不擅长页面设计美工,只好用bootstrap框架,在chrome内核系列的浏览器和IE 11中显示都没有问题,但是在 IE 8下显示却不正常,表格无 ...
- shell脚本调试
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟 ...
- vs2010 未能将脚本调试器附加到计算机上的进程。已附加了一个调试器
图片: 上周不小心升级了IE10,今天,VS2010报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附加了一个调试器”.启动调试失败. 到网上查找解决办法,最后用这个解决 ...
- 10TSQL语言概述-脚本调试-命名规范-天轰穿数据库2014
关键字:sqlserver 数据库脚本 数据库 编码规范大纲:sql概念,TSQL脚本调试,数据库编码规范 优酷超清地址 腾讯超清地址 土豆超清地址
- Linux - Shell脚本调试方法
Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...
- 【转】Linux Shell脚本调试技术
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...
- shell脚本调试技术_转
转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...
- 【转】shell脚本调试(bash trap support bashdb )
原文网址:http://zhu8337797.blog.163.com/blog/static/170617549201122512712136/ 命 令 选 项 功 能 bash –x 脚本名 回显 ...
随机推荐
- Manager模块 队列 管道 进程池
Manager模块 作用: 多进程共享变量. Manager的字典类型: 如果value是简单类型,比如int,可以直接赋值给共享变量,并可以后续直接修改 如果value是复杂类型 ,比如list, ...
- [原创]关于absolute、relative和float的一些思考
absolute: 元素完全脱离文档流,不占文档流的位置,不使用top.left等属性时,仍然在原文档流位置上(但是不在文档流中,也不占用位置),设置了top.left等之后,向上寻找到第一个非sta ...
- SpringMVC拦截器实现用户登录拦截
本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 < ...
- 浅谈命令查询职责分离(CQRS)模式---转载
在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能 ...
- Inno Step教程
最近为js页面做了几个activex控件(只能ie内核浏览器使用),最后要完成打包,之前一直使用winrar的自解压包实现,现在改用Inno Step来做. 工具使用还是比较简单的,语法使用Inno ...
- 【题解】P2161[SHOI2009]会场预约(set)
[题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...
- spring 注入属性
一.注入对象类型的数据 1.配置文件 User类与UserService类均需要创建对象.所以都配置其相应的bean类,另外user需作为userService的属性注入,所以userService需 ...
- 将本地jar包手动复制到Maven库中,在其它电脑上用Maven打包时出错
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/31396107 背景交代:在做图片水印时候引入 ...
- 【leetcode刷题笔记】Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...
- Android进程间通信(IPC)机制Binder简要介绍和学习计划【转】
本文转载自:http://blog.csdn.net/luoshengyang/article/details/6618363 在Android系统中,每一个应用程序都是由一些Activity和Ser ...