首页 新闻 会员 周边

一个关于XMLHttprequest很奇怪的BUG,CSDN找不到答案啊

0
悬赏园豆:30 [已解决问题] 解决于 2012-11-09 14:34

奇怪了,没人遇到这个问题吗,多次点击按钮提交在IE下面,有时候 xmlHttp.responseText 返回空值,有时候又是正确值,这是为什么?在xmlHttp.open("POST","simpleResponse.ashx",true)方法设置为post方式提交且异步设置为true时,当xmlHttp.send(data)方法内的参数不为空,就出现这问题了,
哪个大哥帮帮忙,好几天解决不了,我调试中发现一个问题,当simpleResponse.ashx如果加上  context.Request.Form相关代码,就不出现这问题,这是什么原理?


1.html页面代码:
<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <script type="text/javascript">
        function createXMLHttpRequest() {     
            var xmlHttp = null;  
            if (window.XMLHttpRequest) {
                xmlHttp = new XMLHttpRequest();
            }
            else if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
            }
            if (xmlHttp == null) return


            data = "a=1&b=1"
            xmlHttp.onreadystatechange =function() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                     document.getelementbyid("innerDiv").innerHTML=xmlHttp.responseText;
                }
              }
            };
            xmlHttp.open("POST", "simpleResponse.ashx",true);
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttp.setRequestHeader("Content-Length", data.length);
            xmlHttp.setRequestHeader("Connection", "close");
            xmlHttp.send(data);
        }
    </script>
</head>
<body>
    <form runat="server">
    <input type="button" onclick="createXMLHttpRequest()" value="test" />
    <div id="innerDiv"></div>
    </form>
</body>
</html>


simpleResponse.ashx页面代码:

<%@ WebHandler Language="C#" class="simpleResponse" %>

using System;
using System.Web;

public class simpleResponse : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        //int i=context.Request.Form.count;
        //如果加上这句,或者 string x=context.Request.Form["abc"].tostring(); 只要加入关于Request.Form相关,就能正常返回值
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

sujiaya的主页 sujiaya | 初学一级 | 园豆:10
提问于:2012-08-22 16:43
< >
分享
最佳答案
0

你使用的是post方式,

所有的data都在Request.Form里面。

比如: Request.Form["a"]来获取

 

如果你要Request.QueryString["a"], 这样把你的Url改成:simpleResponse.ashx?a=11&b=22.

 

收获园豆:30
无尽思绪 | 初学一级 |园豆:94 | 2012-08-23 09:17

朋友,你估计没注意看我遇到的问题哦,我的意思是   异步提交时,如果用POST方式提交,且在send(data)里面的data不等于null的时候,ie有时候获取到后台返回的值是空,如果后台不出现request.form的情况下,不是说客户端提交表单数据给后台,后台如何获取的问题,request.form与Request.QueryString我懂啊

sujiaya | 园豆:10 (初学一级) | 2012-08-23 09:25

@sujiaya: 你看看你是ie版本几? 

然后查查MS.XMLHTTP的兼容性

无尽思绪 | 园豆:94 (初学一级) | 2012-08-23 09:27

@sujiaya: 还是建议直接用jQuery.ajax搞定

无尽思绪 | 园豆:94 (初学一级) | 2012-08-23 09:27

@无尽思绪: 每个版本的IE都会出现这问题啊,我看了下JQ,貌似他也会出这问题啊,

sujiaya | 园豆:10 (初学一级) | 2012-08-23 15:15

@sujiaya: 实际测试过? 还有这样的问题?

无尽思绪 | 园豆:94 (初学一级) | 2012-08-23 15:17

@无尽思绪: 嗯,有这样的问题,只是你们用的时候,要嘛用GET,要嘛用 POST的链接传值,更或者是POST同步,没像我这样弄过,所以你们没注意到而已啊

sujiaya | 园豆:10 (初学一级) | 2012-08-24 12:51

@sujiaya: 如果jquery有这样的bug, 那它的bug list肯定有这样的问题。

我还是没太明白你的问题是什么。  jq下post发送data也很正常啊。

把你jq代码贴出来看看

无尽思绪 | 园豆:94 (初学一级) | 2012-08-24 14:35

@无尽思绪: <%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <script type="text/javascript">
        function createXMLHttpRequest() {     
            var xmlHttp = null;  
            if (window.XMLHttpRequest) {
                xmlHttp = new XMLHttpRequest();
            }
            else if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP")
            }
            if (xmlHttp == null) return


            data = "a=1&b=1"
            xmlHttp.onreadystatechange =function() {
            if (xmlHttp.readyState == 4) {
                if (xmlHttp.status == 200) {
                     document.getelementbyid("innerDiv").innerHTML=xmlHttp.responseText;
                }
              }
            };
            xmlHttp.open("POST", "simpleResponse.ashx",true);
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttp.setRequestHeader("Content-Length", data.length);
            xmlHttp.setRequestHeader("Connection", "close");
            xmlHttp.send(data);
        }
    </script>
</head>
<body>
    <form runat="server">
    <input type="button" onclick="createXMLHttpRequest()" value="test" />
    <div id="innerDiv"></div>
    </form>
</body>
</html>


simpleResponse.ashx页面代码:

<%@ WebHandler Language="C#" class="simpleResponse" %>

using System;
using System.Web;

public class simpleResponse : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        //int i=context.Request.Form.count;
        //如果加上这句,或者 string x=context.Request.Form["abc"].tostring(); 只要加入关于Request.Form相关,就能正常返回值
        context.Response.ContentType = "text/plain";
        context.Response.Write("Hello World");
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

你多点几次按钮,会发现  有时候获取到空值,你试试

sujiaya | 园豆:10 (初学一级) | 2012-08-24 17:09
其他回答(3)
0

代码调试了一遍,没发现LZ的问题,唯一的问题是代码错误太多了,大小写,分号什么的。

林J | 园豆:202 (菜鸟二级) | 2012-08-22 17:05

这是我复制的源文件啊,可能是博客园将特殊字符转换了,

支持(0) 反对(0) sujiaya | 园豆:10 (初学一级) | 2012-08-22 17:40
0

simpleResponse.ashx后面加个随机数试试,可能是缓存了吧。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-08-22 17:32

不是缓存问题哦,这些该试的我都试过了,就是找不出原因,麻烦大虾再稍微看看啊

支持(0) 反对(0) sujiaya | 园豆:10 (初学一级) | 2012-08-22 17:39
0

楼主还在写这么原始的AJAX啊,太out了吧,jQuery中ajax就非常的好用,而且游览器的兼容性还是非常好的。

chenping2008 | 园豆:9836 (大侠五级) | 2012-08-22 19:12

我自己写框架,jquery好用是好用,我不需要JQ那么多功能,我只需要基础功能,

支持(0) 反对(0) sujiaya | 园豆:10 (初学一级) | 2012-08-23 09:22

@sujiaya: jQuery提供的功能都是最基本的功能,不是你想象的那么大,那么的复杂。

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-08-23 13:58

@chenping2008: 框架我已经写好了,只是有一点小问题,我必须了解这原理,不然可能会引发更多BUG,用JQ也是这样,只懂得弄别人的东西,而不了解他实现的方法,不是真正理解的话,那用了也白用,出问题了不懂得改,有啥用

支持(0) 反对(0) sujiaya | 园豆:10 (初学一级) | 2012-08-24 12:54

@sujiaya: jQuery,你可以直接看源码,看高手写的源码,相信对你的JS学习帮助更大。

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-08-24 13:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册