ajax调用后台:AJAX调用慎用POST方式,有严重的问题或者BUG

这个问题只存在客户端是IE或IE内核的情况,但是你无法控制客户端使用什么浏览器,所以仍然会给你的应用造成很大的性能问题。
我们先说现象:
服务端:我们只用一个静态的HTML页面ok.html,内容只返OK.
然后我们写一个ajax调用的html在客户端访问:
<script>
function send_request(method,url,param) {
    http_request = false;
    if (window.XMLHttpRequest) {
        http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
            }
        }
    }
    if (!http_request) {
        return;
    }
    http_request.open(method, url,true);
    http_request.send(param);
}
function get(){
    var url = "http://myhost/ok.html?name=axman&test=123";
    for(var i=0;i<1000;i++){
        send_request("GET",url,null);
    }
}
function post(){
    var url = "http://myhost/ok.html";
    for(var i=0;i<1000;i++){
        send_request("POST",url,'name=axman&test=123');
    }
}
</script>
<input type="button" name="b1" value="get" onclick="get()">
<input type="button" name="b2" value="post" onclick="post()">
这个页面上两种方式访问和传递的参数完全一致,当我按下get按钮后,服务端收到了1000个访问记录。
[admin@vm-platform access_log]$ cat apache_access.log.4 wc -l
1000
然后我统计访问时间大于1ms的记录:
[admin@vm-platform access_log]$ cat apache_access.log.4 awk '{if($12 > 1000) print $0}'
结果是空。
现在我们再按下POST按钮:
[admin@vm-platform access_log]$ cat apache_access.log.4 wc -l
2000
当服务端显示2000时,说明访问完成。

  [admin@vm-platform access_log]$ cat apache_access.log.4 awk '{if($12 > 1000) print $0}'的结果:
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696078 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696045 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 695776 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 695332 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696500 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696484 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696215 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696235 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 696182 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:55 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 694964 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:58 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 1274 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -
10.16.14.82 - - - [24/Nov/2011:16:08:59 +0800] "POST /myhost/ok.html HTTP/1.1" 200 20 1019 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" - - "a=-; b=-; c=-" -

请注意apache %D记录的时间是从第一个头域(读到第一个换行回车开始)记时到响应输出(协议层,只要写到BUFF中,不一定已经发送到客户端)。这个时间单位是
微秒,请看一下其中有10条记录近700ms,是get方式的千倍。
因为这个现象给我们的两个应用带来性能问题,我开始分析这个原因,后来从网上搜索到文章说IE内核的浏览器在AJAX调用时,对POST方式采用两步发送,第一次发送
头域,第二次发送BODY。中间有很大的延迟,有时还会造成BODY包丢失,我们从网络抓包的情况看,确实存在只发送了HEADER,后面只有服务端超时返回的错误数据包,再也没有BODY的数据。这样的机率大约有1%.
这个问题在apache作为proxy时,proxy就不能在有效的时间内将客户端请求发送给backend,造成大量的内部错误输出。如果是SS还会引起数据时序混乱。在发送\r\n\r\n后头域还有尾巴没有发送完成,这些现象都是从网络抓包监控到的。
如果换成fireFox,同样的AJAX代码执行POST就没有问题,关键是你根本无法控制用户不使用IE。
网上给出的解决方案试了一下根本不起作用(也许IE6可以起作用,我用的IE8就没有细测IE6),关键是只要部分浏览器发生这个情况,就会给应用带来很大的性能问题。
所以尽量少使用AJAX的POST方式提交数据,但是有时服务端为了安全的原因只允许POST提交,可以动态构造FORM表单,而尽量少使用AJAX来调用POST。

本文链接http://www.cxybl.com/html/wyzz/JavaScript_Ajax/20121127/34459.html

时间: 2024-11-05 14:41:10

ajax调用后台:AJAX调用慎用POST方式,有严重的问题或者BUG的相关文章

ajax-前台js调用后台Ajax方法 提示未定义

问题描述 前台js调用后台Ajax方法 提示未定义 后台方法以及注册AjaxWeb.config配置js调用就报错也应用了jquery.js这个文件本地直接运行时可以的,但是传到服务器就不行了!! 解决方案 ajax 前台js调用后台方法JS前台调用后台方法后台调用前台js的方法 解决方案二: ajaxpro使用的prototype和jquery会争用$的使用权出现冲呕吐.jquery要调用jQuery.noConflict()释放$的使用 而且注意aspx要存在runat=""ser

在JavaScript里面动态调用后台代码有几种方式

问题描述 在JavaScript里面动态调用后台代码有几种方式 解决方案 解决方案二:ajax.解决方案三:ajax然后一般分两种get请求方式post请求方式解决方案四:现在比较流行用jquery!解决方案五:ajaxiframe隐藏提交.解决方案六:如果不用Jquery,方式有:form表达的提交:action;ajax;如果用了Jquery,还有$.get();$.post();$.ajax();$.getJSON();解决方案七:配置Dwr后使用Ajax比较方便解决方案八:jquery解

ajax调用后台: ajax事件的调用顺序

jquery的ajax请求方法: $.ajax({            type: "GET",                dateType:"html",                url: "index.html",                error: function(msg) { alert("error"); },                complete: function(msg) { a

对象-gsp页面用ajax请求后台

问题描述 gsp页面用ajax请求后台 ajax请求后台,返回json对象,怎样取其中的值呢? 解决方案 bdata是一个集合的话要用for遍历输出集合中的对象属性.要是一个对象或者map的话可以直接 对象.属性 输出 解决方案二: 不懂你这种语言,转为json字符串输出看看结构才好取值.看你js代码必须是这种结构的{"result":"xxxx","status":"xxxx"} alert(JSON.stringify(b

.net下不用AJAX实现前台JS调用后台C#方法(小技巧)

纯属小技巧,高手见笑了. 一提到如何在前台JS调用后台C#方法,AJAX成为了必然的想法. 只是实现的细节采用AJAX 1.0或者AjaxPro的区别. 其实如果不用AJAX,我们也能够很方便地利用JS调用后台方法. 步骤如下: 1 前台放一个按钮.设置为隐藏.注意:不能直接设置Visible=false的方式,这样的话在ASP.Net 2.0编译后的代码里是找不到这个按钮的.需要设置风格:style="display:none;" 2 双击按钮,写入C#方法,或者写一个调用后台其他方

前台JS(jquery ajax)调用后台方法实现无刷新级联菜单示例_实用技巧

前台用AJAX直接调用后台方法,老有人发帖提问,没事做个示例 CasMenu.aspx页面: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CasMenu.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr

ASP.NET中JQuery+AJAX调用后台_实用技巧

做订餐系统手机端时,遇到一个问题,实现登录功能时,我要调用后台的方法进行验证和判断.我们应用的是webForm进行开发的,正常情况下只要绑定按钮的方法,前后台对应就可以实现.但是,手机端应用MUI样式之后,就不适用于这种情况了.基于这个问题,我们使用JQuery+Ajax技术,其实MUI中也自带ajax技术.  实现过程: webForm代码:       function login() { var name = document.getElementById("username")

jQuery ajax调用后台C#的例子分析

ajax原理: ajax原理就是实现局部局新然后把数据提交给后台程序后台程序接受到数据之后进入处理逻辑,然后再把返回值传回再由ajax接受之后反馈给用户,这个一个完整的ajax与后台交互执行完了,下面我们看个例子. 前台的jQuery代码  代码如下 复制代码 $(function () {  $("#WFddlType").change( function () {  $.ajax({ type: "Post", url: "feeForm.aspx/F

jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)_jquery

在asp.net webForm开发中,用Jquery ajax调用aspx页面的方法常用的有两种:下面我来简单介绍一下. (1)通过aspx.cs的静态方法+WebMethod进行处理 简单的介绍下WebMethod方法的用法 1.修饰符主要用public static修饰 2.方法前面加上[WebMethod]属性表明这是WebMethod方法 3.前台html页面(Client端)访问时要使用post方法,和后台.cs文件进行数据交互,否则会返回整个html页面. 4.当后台页面返回数据后