我在VFP 中使用 xmlhttp 组件使用异步、同步操作没有问题。。
能正确返回 readyState 状态值。。
C# 中使用同步也没有问题
但如果使用异步 readyState 结果值一直会停留在 1奇怪。。
能正确返回 readyState 状态值。。
C# 中使用同步也没有问题
但如果使用异步 readyState 结果值一直会停留在 1奇怪。。
解决方案 »
- DataGridView数据验证
- 怎么在enum中随机选一个?
- DirectoryEntry问题
- WinForm中如何让DateGrid的垂直滚动条始终显示?
- 请问如何加DataGrid 的背景图片,怎么重写BackGroundImage属性,希望给点完整代码谢谢!
- VB里面的activeX dll项目在VS里面怎么建?顶啊
- DataView中用RowFilter过滤出来的数据集合怎么再转换成一个DataTable?
- 两个combox的问题
- 100请教高手! 我的客户端C#程序找不上代理类!!!我使用的是vs.net
- 请问那里有c#入门经典?电子文档的???
- 新手求教Cheaked问题
- XtraGrid 问题
五种状态如下:
0 对象已创建,但没有调用open()方法
1 open()已调用
2 send()方法已调用
3 浏览器已经收到服务器发来的http头部
4 浏览器已经收到服务器的全部数据,与服务器连接已关闭。
谢谢回复。。 我已经Open,并且Send了
由于winform 中不能对 xmlhttp 设置回调函数(其实也可以,但没必要)所以我用while 对 xmlhttp 的 readyState 进行分析,如果 =4 或者 超时就会退出循环。可发现状态一直都是1.
相比我用VFP 测试。。完全没有问题。。 状态从 1,2,3,4 都是正常的。
谢谢, 注明:下面的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;
}
}
}
我已经尝试很多次了。。 同步的方法已经用了1年多了。。
一直想改成异步的方式(主要想解决超时的问题。)最初我用VFP的COM 来实现功能,很好用,但VFP COM 在多应用程序域+多线程 下 运行库显得不稳定。。所以改用C# 编写相同功能的模块。。 但发现如上问题。