HttpWebRequest的一些小问题

橘子皮... 2018-09-17 01:22:39


Do
Try
sUrl = "https://download.lfd.uci.edu/pythonlibs/o4uhg4xd/tensorflow-1.9.0-cp36-cp36m-win_amd64.whl"
xmlhttp = DirectCast(WebRequest.Create(sUrl), HttpWebRequest)
xmlhttp.KeepAlive = False : xmlhttp.AllowAutoRedirect = False
xmlhttp.Timeout = 9000 : xmlhttp.ReadWriteTimeout = 1
xmlhttp.Method = "GET"
xmlhttp.Host = GetLinkHost(sUrl)
xmlhttp.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
xmlhttp.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
xmlhttp.Referer = "https://www.ifeng.com"
xmlhttp.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
'xmlhttp.Headers.Add("Accept-Encoding", "gzip, deflate")
Using rep As HttpWebResponse = xmlhttp.GetResponse()
Using reps As Stream = rep.GetResponseStream()
'dim bytes() as byte <-----此处不能定义
bytes = GetRepBytes(reps) '获取responseStream返回的字节数组
End Using
End Using

Downbytes(bytes, AppPath() & "\1111.whl") : End '下载保存到文件并退出
Catch ex As WebException
If ex.Status = WebExceptionStatus.Timeout Then
msgbox(ex.StackTrace)
msgbox(ex.Message)
End
Else
msgbox("other")
Exit Do
End If
Catch ex As Exception
msgbox(ex.Message)
msgbox(ex.StackTrace)
Exit Do
Finally
xmlhttp.Abort() : xmlhttp = Nothing
End Try
Loop

End


有3个小问题:
1: ReadWriteTimeout 描述的是获取和上传数据的最大等待时间,我这里特意找了个30M的文件,ReadWriteTimeout 设置为1ms,为什么还是下载完成了呢,不应该直接抛出TimeoutException异常才对么???我测试了,无论这个ReadWriteTimeout 改多少都一样会下载完成,如何理解这个ReadWriteTimeout ??

2: 'dim bytes() as byte <-----此处不能定义 这行,在using里定义的变量是局部变量,using外无法调用,这可以理解,但是为什么在vb.net里直接不定义,直接用,编译器却认为他是全局变量了呢?因为测试了using外也可以用

3: .Timeout 这个设置是不是从连接到连接成功所需的时间,不包含下载上传数据的时间???是不是也不包含DNS解析所花的时间??
像google这种DNS解析卡住的网站,如果要设置有效的超时时间,到了就跳出,是不是只能用beginGetResponseStream ??有其他简单点的方法么??

4: 整个代码如何优化一下,我的愿意就是GET一个网址获取他返回的responsetext, 设置3秒,超过3秒还没返回就abort重新再来,一直到成功返回 responsetext 就跳出,但是如果发生其他异常的话,直接跳出循环。我这写法太难看了感觉,但是又没什么好写法,因为vb.net里的超时貌似必须用try catch来捕获,写起来就感觉有点累赘
...全文
603 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2018-10-12
  • 打赏
  • 举报
回复
你是不是想不管超时怎么设置,只要提交请求超过3秒就退出来? 写个task,设置canceltoken,在线程上面控制超时时间
清风道禅 2018-10-11
  • 打赏
  • 举报
回复
1.30M 对于你在本地来说 肯定要不了1秒 2.设置的超时时间如果到了的话会抛出异常的不用怀疑 3.VB.NET 看不太懂 但是 byte和Byte[] 还是要搞清楚的 4.不需要你动态去设置超时时间 一般默认就好
橘子皮... 2018-10-10
  • 打赏
  • 举报
回复
顶下吧~!~~~~~
lindexi_gd 2018-09-18
  • 打赏
  • 举报
回复
很久没使用 VB 所以很抱歉我没看懂代码 Timeout不包括DNS解析,Timeout包含的过程有:获取请求流,向请求流中写数据,发送请求,返回响应 ReadWriteTimeout规定了他们每次对流进行操作的最大等待时间(注意是每次操作,不是读写的总时间) 但是 ReadWriteTimeout 作用只是 GetResponse 方法不包括读取的uijm 使用 GetResponseAsync 时 Timeout 设置不会超时,但是看到代码使用的是 GetResponse 方法

110,536

社区成员

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

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

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