You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:23:05