Windows Mobile使用C#的HttpWebResponse假死问题,请高手指点,不胜感激!

Sdhjt 2010-01-16 10:58:21
在WindowsMobile平台上,用C#的HttpWebRequest和HttpWebResponse类编写通信程序,代码片度如下:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(new Uri(url));
req.Accept="*/*";
req.UserAgent = "Mozilla/4.0(compatible;PocketIE 5.0;Windows CE 5.2)";
req.Method = "POST";

req.ContentLength = pd.Length;
req.ContentType = "application/binary";
Stream outputStream = req.GetRequestStream();
outputStream.Write(pd, 0, pd.Length);
outputStream.Flush();
outputStream.Close();

HttpWebResponse res = (HttpWebResponse)req.GetResponse();//卡在了这一句上
byte[] ps = new byte[res.ContentLength];
int totalBytesRead = 0;
……………………………………………………
程序卡在了如上位置上,用Cellular Emulator观察,确实有数据传出和传入。换了WM6和WM6.5两个平台,都卡住了。换了一部i780真机也卡住了。卡住的现象就是,在WM上,程序界面没有任何响应,VS中也不报错。
同样的代码片段,放在PC上运行,可以正常返回结果。
我的目标平台是WM5.0 PocketPC,用的.NET CF 3.5
请大家帮帮忙,不胜感激哈!!
...全文
338 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sdhjt 2010-01-20
  • 打赏
  • 举报
回复
问题已部分解决,我使用了HTTPWebRequest的异步通信方式,并将Timeout改成了20000,在真机上效果比较好,可以与服务器正常通信。不过在模拟器中还是有这个毛病,仅在极个别情况下正常一次。估计是Cellular Emulator的问题吧,呵呵。
感谢大家的回答,7楼给的回答对我启发最大,所以分给7楼了,呵呵。
Sdhjt 2010-01-18
  • 打赏
  • 举报
回复
谢谢4楼,我试试!
Sdhjt 2010-01-18
  • 打赏
  • 举报
回复
谢谢LS解答!

模拟器可以上网,PocketIE可打开网页,可下载东西。Cellular Emulator有数据输入与输出。通过HTTPLOOK拦截HTTP包发现通信也正常。

今天我特意编写了一个用HTTPWebRequest通信的小程序,一模一样的代码,在PC机上可以获取HTML,在模拟器上就卡在
System.dll!System.Net.OSSOCK.select(int[] readfds = {int[2]}, int[] writefds = null, int[] exceptfds = null, int[] timeval = null, ref int rc = 0)
这里。

我甚至直接在PC上运行了Windows Mobile的版本,仍然返回正确的结果。。。这种现象让我百思不得其解。以下是我写的小例子,希望哪位大侠能抽空帮我看看,在你们的机器环境中是不是能正常运行,不胜感激哈!!!
http://cid-913ee08298416cb8.skydrive.live.com/self.aspx/.Public/SmartDeviceGetHtml.rar
iqlife 2010-01-18
  • 打赏
  • 举报
回复
我之前WM做HTTP上传图片的时候也遇到一个很怪的问题呢,好像HTTP在WM上支持性本来就不好,后面我整啊整,准备换WEBSERVICE通信协议的时候突然就可以 了,没有时间去对比代码上的差异,感觉好像是字符之类的或者HTTP前面定义的问题,超级神奇的HTTPREQUEST,用微软MSDN上的例子试试
88csdn 2010-01-18
  • 打赏
  • 举报
回复
用模拟器的时候,模拟器可以上网不?
用真机的话,走cmnet试试
Sdhjt 2010-01-18
  • 打赏
  • 举报
回复
感谢LS回答哈!

我用的是HTTPWebRequest,这个类可以自动实现GPRS初始化,我在编代码的时候也是考虑到HTTPWebRequest对GPRS通信来说比较方便,如果纯用Socket编程的话涉及到很多底层的东西。不过如果这个问题是在解决不了,只能硬着头皮用Socket了,呵呵。

PS:其实这个程序在通信的时候,貌似是卡在了接收上,用嗅探器发现是有数据返回的,也就是说,服务器返回了数据,但是HTTPWebResponse假死了,无法将结果返回给我的程序。网上搜索System.Net.OSSOCK.select这个函数,貌似就是用来查询通信状态的,估计在查询的时候阻塞了。。。唉。。。估计我RP有问题。。。
yanbo_hu 2010-01-18
  • 打赏
  • 举报
回复
【解决办法】:手机上使用Socket之前必须的初始化一下GPRS链路,才可以.
【问题原因】:PC上使用不需要GPRS所有可以直接使用。完全正常。
但是在手机上,TCP协议的底层【物理链路】是走GPRS的,所有你在用socket的时候程序从应用层在到传输层,然后到网络层。。。都是正常的。可是再导物理链路层的时候出现问题了。
初始化也很简单,google一下有很多现成的。



【祝你好运】
Sdhjt 2010-01-16
  • 打赏
  • 举报
回复
感谢楼上回答!
我暂停后的调用堆栈如下:
System.dll!System.Net.OSSOCK.select(int[] readfds = {int[2]}, int[] writefds = null, int[] exceptfds = null, int[] timeval = null, ref int rc = 0)//停在了这一行
System.dll!System.Net.Sockets.Socket.Poll(int microSeconds = -1, System.Net.Sockets.SelectMode mode = SelectRead) + 0x5d 字节
System.dll!System.Net.Connection.Read(byte[] buffer = {byte[1024]}, int offset = 0, int count = 1024) + 0x8f 字节
System.dll!System.Net.HttpWebRequest.ConnectionClient.Read(byte[] data = {byte[1024]}, int offset = 0, int length = 1024) + 0x28 字节
System.dll!System.Net.HttpReadStream.NetworkRead(byte[] data = {byte[1024]}, int offset = 0, int length = 1024) + 0xf 字节
System.dll!System.Net.CloseReadStream.doRead(byte[] data = {byte[1024]}, int offset = 0, int length = 1024)
System.dll!System.Net.HttpReadStream.Read(byte[] buffer = {byte[1024]}, int offset = 0, int length = 1024) + 0x79 字节
System.dll!System.Net.HttpWebRequest.MakeMemoryStream(System.IO.Stream stream = {System.Net.CloseReadStream}) + 0x42 字节
System.dll!System.Net.HttpWebRequest.finishGetResponse() + 0x68 字节
System.dll!System.Net.HttpWebRequest.GetResponse() + 0x6 字节
………………………………

上面内容一头雾水,不知道是哪部分导致卡壳……
ProgrammerNO1 2010-01-16
  • 打赏
  • 举报
回复
能通过堆栈查询么

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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