今天解决了一位朋友使用 Anthem.NET 遇到的问题。他的代码在 Windows XP 的开发机器上反应正常,而部署到 2003 Server 的服务器上就提示 "BADRESPONSE".

这个问题产生的原因是,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 提示的信息如下:

; LEFT: 416px; POSITION: absolute; TOP: 96px\">Test</a>"},"script":["window.location = 'http://www.sina.com.cn';"]}
---------------------------
确定   
---------------------------

看上去有点乱,我们把它还原为正常的 js 代码,实际上是这样一个对象:

JavaScript:

; LEFT: 416px; POSITION: absolute; TOP: 96px\">Test</a>",
    },
    "script": [
        "window.location = 'http://www.sina.com.cn';"
    ]
}

其中 controls 是需要更新 innerHTML 的客户端控件集合,以及要更新的源代码。
Anthem.NET 修改了常见默认控件的 Render 方法,使控件输出的 HTML 外围多了一个容器控件. 而每次回调后,都会通过这个人为添加的容器来更新其中的控件 HTML 输出。
看如下 HTML:

HTML:

<span id="Anthem_LinkButton1__"><a id="LinkButton1" onclick="Anthem_FireCallBackEvent(this,event,'LinkButton1','',true,'','','',true,null,null,null,true,true);return false;" href="javascript:__doPostBack('LinkButton1','')" style="Z-INDEX: 101; LEFT: 416px; POSITION: absolute; TOP: 96px">Test</a></span>

这段代码中,span 便是 LinkButton 的容器。

上述返回对象中的 script 属性,是在服务器端设定的,需要在返回后执行的脚本代码的集合。
服务器端可以通过下列语句来添加脚本:

C#:

Anthem.Manager.AddScriptForClientSideEval("window.location = 'http://www.sina.com.cn';");

以上分析的是 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.open("POST", url ? url : Anthem_DefaultURL, clientCallBack ? true : false);
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
x.setRequestHeader("Accept-Encoding", "gzip, deflate");

其默认请求编码是 utf-8 的。

而其输出编码,则可以通过 web.config 来定制。方法如下:

<configuration>
    <system.web>
        <appSettings>       
            <add key="Anthem.ResponseEncoding" value="gb2312" />         
            <add key="Anthem.ResponseType" value="gb2312" />
        </appSettings>
    </system.web>
</configuration>

这个办法是我通过分析 Anthem 的源码发现的,奇怪的是在其文档中好像没有发现相关的说明。
相关代码如下:

Manager.cs (C#):

private void ConfigureResponse(HttpResponse resp) {
    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" 问题,及脚本调试技巧小结的更多相关文章

  1. shell脚本调试技巧

    shell脚本调试之工具——bashdb http://www.cnblogs.com/itcomputer/p/5011845.html

  2. ASP.NET MVC bootstrap 3 ie 8兼容问题及错误解决(取消IE禁用IE脚本调试定位js文件错误)

    因要做一个B/S架构的项目,使用MVC框架技术,本人不擅长页面设计美工,只好用bootstrap框架,在chrome内核系列的浏览器和IE 11中显示都没有问题,但是在 IE 8下显示却不正常,表格无 ...

  3. shell脚本调试

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ 一. 前言 shell编程在unix/linux世界中使用得非常广泛,熟 ...

  4. vs2010 未能将脚本调试器附加到计算机上的进程。已附加了一个调试器

    图片: 上周不小心升级了IE10,今天,VS2010报:未能将脚本调试器附加到计算机XXX上的进程iexplore.exe . 已附加了一个调试器”.启动调试失败. 到网上查找解决办法,最后用这个解决 ...

  5. 10TSQL语言概述-脚本调试-命名规范-天轰穿数据库2014

    关键字:sqlserver 数据库脚本 数据库 编码规范大纲:sql概念,TSQL脚本调试,数据库编码规范 优酷超清地址 腾讯超清地址 土豆超清地址

  6. Linux - Shell脚本调试方法

    Shell脚本调试选项 Shell本身提供一些调试方法选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误. -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出. -x,提供跟踪执 ...

  7. 【转】Linux Shell脚本调试技术

    本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 本文全面系统地介绍了shell脚本调试技 ...

  8. shell脚本调试技术_转

    转自:http://itlab.idcquan.com/linux/SHELL/727128.html 参考:https://linux.cn/article-8045-1.html 本文全面系统地介 ...

  9. 【转】shell脚本调试(bash trap support bashdb )

    原文网址:http://zhu8337797.blog.163.com/blog/static/170617549201122512712136/ 命 令 选 项 功 能 bash –x 脚本名 回显 ...

随机推荐

  1. Java 学习 day09

    01-面向对象(内部类访问规则) package myFirstCode; /* 内部类的访问规则: 1. 内部类可以直接访问外部类的成员,包括私有private. 之所以可以直接访问外部类中的成员, ...

  2. 页游手游服务器(二)c支持mysql

    上一篇说的是liua的net拓展,这一篇说lua的sql拓展,准确说是mysql拓展,这里推荐下postgre,比mysql好用,支持数组,各种好,不过腾讯平台不支持,所以你的公司要和腾讯合作,掂量下 ...

  3. windows7下cmd命令窗口没有滚动条的解救方法

    由于昨天的好123问题没有解决,我想查看一下本机的ip地址等,于是打开了cmd窗口,输入ipconfig/all命令进行查看,但是发现出现了下面的窗口,无法进行滚动,完全无法查看详细的信息. 然后我百 ...

  4. urllib2下载网页的三种方法

    1.最直接的方法 #-*- coding: utf-8 -*- import urllib2 #直接请求 response = urllib2.urlopen('https://www.baidu.c ...

  5. python基础20 -------python中的异常处理

    一.python程序中的会出现的错误. 1.语法错误:这种错误根本过不了python解释器的语法检测阶段,必须在程序执行之前进行改正. 2.逻辑错误:这种错误虽然过了语法检测阶段但是程序在执行的过程中 ...

  6. MySQL——存储过程

    核心知识点: 1.什么存储过程?它都有哪些优点? 2.存储过程的语法和参数? 3.存储过程有哪些操作? 4.存储过程常用的控制语句? 一.存储过程概论 SQL语句需要先编译然后执行,而存储过程是一组为 ...

  7. 深度问答之提取语料,导入了yml模块

    根据目录下的yml文件循环创建同名文件夹,并从yml文件读取问答并给每个文件夹写入question和answer文件 #!/usr/bin/env python # coding:utf8 # aut ...

  8. Python:笔记(2)——函数与模块

    Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...

  9. Kattis - triangle 【数学】

    题意 求第N个迭代三角形 中 所有黑色三角形的周长的整数部分的位数 思路 该三角形的周长是 3^(n + 1)/ 2 ^ (n) 然后 可以用 long double 存下来 再求位数 就可以 AC ...

  10. Android系统篇之—-编写系统服务并且将其编译到系统源码中【转】

    本文转载自:http://www.wjdiankong.cn/android%E7%B3%BB%E7%BB%9F%E7%AF%87%E4%B9%8B-%E7%BC%96%E5%86%99%E7%B3% ...