Foxtable(狐表)用户栏目专家坐堂 → 使用Httpclient中的FormData带参数时超时


  共有5217人关注过本帖树形打印复制链接

主题:使用Httpclient中的FormData带参数时超时

帅哥哟,离线,有人找我吗?
hongsejiyi
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
使用Httpclient中的FormData带参数时超时  发帖心情 Post By:2022/5/27 9:18:00 [显示全部帖子]

使用如下代码:
Dim hc As New HttpClient("http://xsvjz.natappvip.cc/login")
hc.FormData.Add("username", "zsh")
hc.FormData.Add("password", "zsh2021")
hc.Timeout = 15
Output.Show(nr)

会显示超时,但偶尔会正常。
超时时,http request中显示 “login/post 100 Continue" 字样,如果正常时是”login/post  200 Ok",如下图:


此主题相关图片如下:100_continue.jpg
按此在新窗口浏览图片

请教问题如下:
通过浏览器(WEB端访问)一切正常,说明服务端处理数据,返回数据没有问题;
但就是通过 HttpClient的模式访问出现超时出错的情况,但有时也正常,蒙了就
如果不使用 FormData带参数的话,就不会超时,也就是加了这个功能时才会出现
这个“100 Continue”就是出现超时的标志,如何造成的,如何处理呢?谢谢




 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/27 10:14:00 [显示全部帖子]

加上了 hc.ContentType = "application/x-www-form-urlencoded" 结果也是一样的

老师,使用文档,指的是什么意思?(服务端代码,客户端代码吗?)
[此贴子已经被作者于2022/5/27 10:16:21编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/27 10:36:00 [显示全部帖子]

发现将域名改为IP地址,就一切正常,再换成域名就又超时,但域名访问模式通过浏览器WEB方式访问是很正常的
在域名访问时,如果将FormData去掉,又一切正常,只是这种带参数的方式有“超时”的问题,这个功能眼前也正是我想要的
难道和域名访问有关

我先试一下原来的FT版本,看看是不是最新版的问题

 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/27 13:13:00 [显示全部帖子]

试了一下2021.5.29的FT版本,问题同样存在,现上传相关文档的压缩包(含服务端、客户端、内网域名服务三个文件夹)
请老师给看看,是什么原因造成的,该如何处理
因为上传附件大小进行了限制,只是上传了服务端和客户端,内网域名服务的文件(7M大小),需要点击【内网域名服务下载,下载后文件夹【update_soft】放置在与【服务端、客户端文件同一级目录即可】

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:100continue超时测试.rar



[此贴子已经被作者于2022/5/27 13:17:58编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/27 15:00:00 [显示全部帖子]

下图是我搜到的一些相关现象的处理方案,我看不懂,请老师帮忙解析一下,该如何处置(在域名访问,且使用内网域名服务访问时,服务器是能够得到提交的数据,只是在“响应客户端请求”的e.writestring("....."),在客户端没有起作用

图片点击可在新窗口打开查看此主题相关图片如下:100_continue_处理分析.jpg
图片点击可在新窗口打开查看



 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/27 15:36:00 [显示全部帖子]

我试一下

 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/27 16:15:00 [显示全部帖子]

还是不行
现在的问题是,服务端已经识别客户端的头部信息 含有 Expect:100-continue的标识,也已经识别并获得了客户端提交上来的 username和password信息,如何对这个进行到一半的客户端请求进行”响应“,这现在需要解决的问题,因为只有对客户端的这个请求进行正确响应后,才到进行下一步的提交,服务端在设置的15秒中之内没有响应客户端,所以客户端就出现了”超时“问题,这个请求就算是”失败“了。

 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/29 11:20:00 [显示全部帖子]

该问题已经解决,代码如下,请参考:

以下内容为程序代码:

1 Dim httpURL As New System.Uri("http://xsvjz.natappvip.cc/login") '创建一个WEB地址,服务器的网址及路径
2 Dim httpReq As System.Net.HttpWebRequest = System.Net.WebRequest.Create(httpURL) '创建一个基于服务器路径的WebRequest对象,并返回一个HttpWebReauest类型的引用,赋值给httpReq变量
3 httpReq.Method = "post" '设置数据请求提交的方式为 POST
4 httpReq.ContinueTimeout = 10 '设置请求超时时间 10秒
5
6 httpReq.ServicePoint.Expect100Continue = False
7 httpReq.Expect = True
8 httpReq.C '设置请求的媒体类型
9 output.Show(httpReq.Address.ToString) '显示当前请求的IP或者域名地址信息(获取实际响应请求的 Internet 资源的统一资源标识符 (URI)。)
10
11 Dim inputdata As String = "zsh"
12 Dim postData As String = "username" + ChrW(61) + inputData
13 postData = postData & "&" & "password=zsh2021"
14 Output.Show(postdata) '以上三行将产生数据串,格式为:username=zsh&password=zsh2021
15
16 Dim encoding As New ASCIIEncoding() '表示 Unicode 字符的 ASCII 字符编码,完整定义格式为: New system.text.ASCIIEncoding()
17 Dim byte1 As Byte() = encoding.GetBytes(postData) '将一组字符编码为一个字节序列
18 Output.Show(byte1.ToString) '当前显示的结果为: System.Byte[]
19
20 httpReq.ContentLength = byte1.Length '设置提交数据请求的内容长度,等于字节序列长度
21 '这样,已经设置了httpReq提交的请求内容byte1及长度byte1.length
22
23 Dim newStream As System.IO.Stream = httpReq.GetRequestStream() '创建初始化httpRea的读取流(获取用于写入请求数据的 Stream 对象),并返回这个 system.io.stream对象的引用,赋值给newstream变量
24 newStream.Write(byte1, 0, byte1.Length) '将获得的内容,通过流(stream)方法(Write)写入到(数据流)中
25 Output.Show(cexp("数据流长度:{1}", byte1.Length)) '显示信息,结果:数据流长度:{1}
26 newStream.Close() '关闭当前流并释放与之关联的所有资源
27
28
29
30 Dim httpResp As System.Net.HttpWebResponse = httpReq.GetResponse() '返回来自 Internet 资源的响应的引用,赋值给 httpResp变量(返回一个HttpWebResponse类)
31 httpReq.KeepAlive = False
32 output.Show(httpResp.StatusCode) '显示来自服务器响应的状态码(获取响应的状态),此时显示结果:200
33 Dim reader As New IO.StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding(65001)) '按指定的编码格式,读取指定服务器的响应资源,写入reader变量里(使其以一种特定的编码从字节流中读取字符)
34 Dim respHTML As String = reader.ReadToEnd() '读取来自流的当前位置到结尾的所有字符,写入字符串变量 restHTML,也就是获得从服务器返回的数据
35
36 Output.Show(resphtml) '显示提交带参数的信息后的服务器响应结果(本例也就是网页授权的结果数据,JSON格式的数据)

[此贴子已经被作者于2022/5/29 11:24:12编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
hongsejiyi
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:333 积分:5177 威望:0 精华:0 注册:2019/1/1 15:53:00
  发帖心情 Post By:2022/5/29 16:38:00 [显示全部帖子]

总感觉使用FT中的HttpClient方便,12楼的用法,虽然算是解决了这个问题,还是不甘心。最后,还是找到了一个“算圆满”的解决办法,感觉还是挺好的,代码如下:(红色字体是关键)


Dim url As New System.Uri("http://xsvjz.natappvip.cc/login")
Dim servicePoint = System.Net.ServicePointManager.FindServicePoint(url)
servicePoint.Expect100Continue = False

Dim hc As New HttpClient(url.AbsoluteUri)
hc.Timeout = 5
hc.FormData.Add("username", "zsh")
hc.FormData.Add("password", "zsh2021")

Dim nr As String = hc.GetData()
Output.Show(nr)

经过测试,如果设置成True,“超时”出错复现,这说明 FT官方大概把它默认设置成“True”了。


 回到顶部