100 分求助 XMLHTTP 异步 同步 奇怪现象。。。

youlei35 2010-08-10 11:00:22
我在VFP 中使用 xmlhttp 组件使用异步、同步操作没有问题。。
能正确返回 readyState 状态值。。


C# 中使用同步也没有问题。。。


但如果使用异步。。。 readyState 结果值一直会停留在 1



奇怪。。。。。。。。
...全文
183 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
youlei35 2010-08-24
  • 打赏
  • 举报
回复
结贴的时候怎么看到有的楼被斑竹删除? 好象没有不愉快的回复啊。。。
youlei35 2010-08-17
  • 打赏
  • 举报
回复
悲剧。。。同步还的用一阵子了。。。
Angelicer 2010-08-15
  • 打赏
  • 举报
回复
初学者,学习‘
studentliudong 2010-08-15
  • 打赏
  • 举报
回复
睡前学习+帮顶
youlei35 2010-08-15
  • 打赏
  • 举报
回复
没人讨论就结贴了。。。
youlei35 2010-08-11
  • 打赏
  • 举报
回复
不好意思。。之前没发过代码,没注意到可以用UUB 修饰。。。
youlei35 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 a184485789 的回复:]
有没有代码啊,发出来看看嘛
[/Quote]

谢谢, 注明:下面的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.ResponseText



C# 代码:

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;
}

}
}

a184485789 2010-08-11
  • 打赏
  • 举报
回复
有没有代码啊,发出来看看嘛
lilin8905 2010-08-11
  • 打赏
  • 举报
回复
学习。
porschev 2010-08-11
  • 打赏
  • 举报
回复
youlei35 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sp1234 的回复:]
引用 2 楼 youlei35 的回复:
其实也可以,但没必要
假设你愿意尝试,也许3分钟就解决了,也用不着csdn上浪费这么多时间。

思路决定结果,而不仅仅是编写代码。
[/Quote]

我已经尝试很多次了。。。。。 同步的方法已经用了1年多了。。
一直想改成异步的方式(主要想解决超时的问题。)

最初我用VFP的COM 来实现功能,很好用,但VFP COM 在多应用程序域+多线程 下 运行库显得不稳定。。

所以改用C# 编写相同功能的模块。。 但发现如上问题。。。。

jzh612785 2010-08-11
  • 打赏
  • 举报
回复
楼上这为仁兄说得是相当的对
  • 打赏
  • 举报
回复
你成功了(实在是太简单了就能成功了),再来讨论技术,会更直接一些。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 youlei35 的回复:]
其实也可以,但没必要[/Quote]
假设你愿意尝试,也许3分钟就解决了,也用不着csdn上浪费这么多时间。

思路决定结果,而不仅仅是编写代码。
youlei35 2010-08-11
  • 打赏
  • 举报
回复
100 分顶起。。。
youlei35 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jiuchongtiann 的回复:]
不可能吧,应该是你没有调用send方法,所有状态停留在1。
五种状态如下:
0 对象已创建,但没有调用open()方法
1 open()已调用
2 send()方法已调用
3 浏览器已经收到服务器发来的http头部
4 浏览器已经收到服务器的全部数据,与服务器连接已关闭。
[/Quote]

谢谢回复。。 我已经Open,并且Send了


由于winform 中不能对 xmlhttp 设置回调函数(其实也可以,但没必要)

所以我用while 对 xmlhttp 的 readyState 进行分析,如果 =4 或者 超时就会退出循环。

可发现状态一直都是1.。。。


相比我用VFP 测试。。完全没有问题。。 状态从 1,2,3,4 都是正常的。


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

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧