我在VFP 中使用 xmlhttp 组件使用异步、同步操作没有问题。。
能正确返回 readyState 状态值。。
C# 中使用同步也没有问题
但如果使用异步 readyState 结果值一直会停留在 1奇怪。。

解决方案 »

  1.   

    不可能吧,应该是你没有调用send方法,所有状态停留在1。
    五种状态如下:
    0 对象已创建,但没有调用open()方法
    1 open()已调用
    2 send()方法已调用
    3 浏览器已经收到服务器发来的http头部
    4 浏览器已经收到服务器的全部数据,与服务器连接已关闭。
      

  2.   


    谢谢回复。。 我已经Open,并且Send了
    由于winform 中不能对 xmlhttp 设置回调函数(其实也可以,但没必要)所以我用while 对 xmlhttp 的 readyState  进行分析,如果 =4 或者 超时就会退出循环。可发现状态一直都是1.
    相比我用VFP 测试。。完全没有问题。。 状态从 1,2,3,4 都是正常的。
      

  3.   


    谢谢, 注明:下面的VFP 代码可直接运行,没有问题。。
    C# 代码为主要部分。 
    VFP 代码 
    Set Safety Off
    sUrl = "http://dbis.ucdavis.edu/courses/sqltutorial/tutorial.pdf?time=12eee122"
    Flag = .F.
    CLEAR
    ReadyState = ''
    m.oXML = Createobject("msxml2.XMLHTTP")
    m.oXML.open("get",sUrl,.t.)
    m.oXML.SetRequestHeader("content","text/html")
    m.oXML.SetRequestHeader("charset","gb2312")
    *Wait Windows 'Begin Download document!'
    m.oXML.send()
    Do While .T.
    Try
      m.ReadyState = m.oXML.ReadyState
      ?m.ReadyState
    Catch
      m.ReadyState = 0
    Endtry
    IF m.ReadyState>=3
    try
    ?m.oXML.ResponseText
    CATCH
    ?"NO"
    endtry
    Endif
    If m.ReadyState=4
      Exit
    Endif EndDo
    ?m.oXML.ResponseTextC# 代码:MSXML2.XMLHTTP oXML = new MSXML2.XMLHTTP();
    switch(emType)
                {
                    case HTMLPOSTTYPE.GET:
                        oXML.open("get", tsUrl,true, null, null);
                             setRequestHeads(emType,0);
                        try
                        {
                            oXML.send(null);
                        }
                        catch(Exception ee)
                        {                     OUTPUT("GET ERROR: " + ee.StackTrace + " " + ee.Source.ToString() + "  " + ee.Message);
                            
                            return -1;
                        }
                        break;
                    case HTMLPOSTTYPE.POST:
                        oXML.open("post", tsUrl, false, null, null);
                        setRequestHeads(emType,tsPostData.Length);
                        try
                        {
                            oXML.send(tsPostData);
                        }
                        catch (Exception ee)
                        {
                                               OUTPUT("POST ERROR:" + ee.StackTrace + " " + ee.Source.ToString() + "  " + ee.Message);                        return -1;
                        }
                        break;
                }
            while (true)
                {
                    try
                    {
                        System.Threading.Thread.Sleep(100);
                        nReadState = oXML.readyState;                    _TsDiff = DateTime.Now.Subtract(_dtBeginRun);
                        if (_TsDiff.TotalSeconds > 120)
                        {
                            nErrorCode = -11; //timeout                        break;
                        }                    if (nReadState >= 3)
                        {
                            _o = oXML.getResponseHeader("Content-Length");
                            if (_o.ToString().Trim() != "")
                            {
                                nLength = Convert.ToDouble(_o);
                            }                        sResonseHeadType = oXML.getResponseHeader("Content-Type");
                        }
                    }
                    catch (Exception ee)
                    {
                        nReadState = 0;
                                       }                
                    
         
                    if (nReadState == 4)
                    {                    nDownLoadFile = ((Byte[])oXML.responseBody).Length;                    break;
                    }
                    else
                    {
                        switch (nReadState)
                        {
                            case 0:
                                  break;
                        }
                        
                    }
                }
      

  4.   

    不好意思。。之前没发过代码,没注意到可以用UUB 修饰
      

  5.   

    假设你愿意尝试,也许3分钟就解决了,也用不着csdn上浪费这么多时间。思路决定结果,而不仅仅是编写代码。
      

  6.   


    我已经尝试很多次了。。 同步的方法已经用了1年多了。。
    一直想改成异步的方式(主要想解决超时的问题。)最初我用VFP的COM 来实现功能,很好用,但VFP COM 在多应用程序域+多线程 下 运行库显得不稳定。。所以改用C# 编写相同功能的模块。。  但发现如上问题。