VB.NET带TCP端口的HTTP POST请求访问PLC板异常问题求助
VB.NET带TCP端口的HTTP POST请求访问PLC板异常问题求助
问题场景
你编写了一个VB.NET的httpPOST_CCN子程序,用于向PLC板发送HTTP POST请求。在局域网环境下,不指定TCP端口时程序运行正常,但当传入带特定端口的外部地址(例如X.X.X.X:8000)时,程序出现请求为空的错误——尽管你能通过浏览器正常访问该地址。你怀疑问题可能出在端口处理或响应超时上,希望找到解决办法。
可能原因与解决方案
你猜测的响应超时是非常有可能的:外部网络链路的延迟通常远高于局域网,默认的请求超时时间可能不足以等待PLC板返回响应。除此之外,我们还需要确认端口传递是否正确,并通过异常捕获来定位具体问题。
1. 延长请求超时时间
HttpWebRequest的默认超时时间为100秒,但外部网络加上PLC板的响应延迟可能还是不够。你可以手动设置更长的超时时间,同时配置读写操作的超时,避免因读取响应过慢导致失败:
' 登录请求的超时配置 Dim Request As HttpWebRequest = HttpWebRequest.Create(url) Request.Timeout = 30000 ' 设置为30秒(可根据实际情况调整) Request.ReadWriteTimeout = 30000 ' 读写响应的超时时间 ' ... 保留原有代码 ... ' 输出控制请求的超时配置 Dim RequestOut As HttpWebRequest = HttpWebRequest.Create(outputUrl) RequestOut.Timeout = 30000 RequestOut.ReadWriteTimeout = 30000 ' ... 保留原有代码 ...
2. 添加异常捕获,精准定位错误
目前你只知道请求为空,但无法确定具体是连接失败、超时还是其他问题。添加Try-Catch块可以捕获详细的异常信息,帮助你快速排查:
Public Sub httpPOST_CCN(ip As String, user As String, pwd As String, digout As Integer, sec As Integer, dec As Integer, verso As String, Optional causale As String = "", Optional ultimaTarga As String = "", Optional ultimoBadge As String = "") Try Dim CookieJar As New CookieContainer Dim url As String = String.Format("http://{0}/goform/UserLogin", ip) Dim postData As String = String.Format("username={0}&pwd={1}", user, pwd) ' ... 原有登录请求代码 ... ' ... 原有输出请求代码 ... Catch ex As WebException ' 捕获HTTP相关异常,打印详细信息 MessageBox.Show($"请求异常: {ex.Message}" & vbCrLf & $"异常状态: {ex.Status}") If ex.Response IsNot Nothing Then Using reader As New StreamReader(ex.Response.GetResponseStream()) MessageBox.Show($"服务器返回内容: {reader.ReadToEnd()}") End Using End If Catch ex As Exception ' 捕获其他类型异常 MessageBox.Show($"未知错误: {ex.Message}") End Try End Sub
3. 验证端口传递是否正确
你传入的ip参数包含端口(如X.X.X.X:8000),拼接后的URL格式http://X.X.X.X:8000/goform/UserLogin是正确的,但可以通过打印请求地址来确认HttpWebRequest是否正确解析:
Dim Request As HttpWebRequest = HttpWebRequest.Create(url) Console.WriteLine($"实际请求地址: {Request.Address}") ' 查看输出是否与预期一致
4. 其他可选调整
- 保持连接设置:你之前注释掉了
Request.KeepAlive = False,外部网络环境下可以尝试恢复这个设置(默认值为True),确保连接保持稳定。 - 代理配置:如果你的浏览器需要通过代理才能访问外部地址,程序也需要同步配置代理:
Request.Proxy = WebRequest.GetSystemWebProxy() Request.Proxy.Credentials = CredentialCache.DefaultCredentials
总结
优先尝试添加超时设置和异常捕获,通过异常信息确定问题根源。如果是超时导致的错误,延长超时时间即可解决;如果是其他问题,异常提示会给你明确的排查方向。
备注:内容来源于stack exchange,提问作者Gabriele Cozzolino
相关产品推荐
相关产品推荐

