我有一个用vb.net编写的应用程序(不是 ASP.NET,它是Windows控制台应用程序)。我正在尝试调用URL(HTML页面),并将响应恢复到字符串中。响应是直接的JSON,没有任何HTML标签。它开放 { 并关闭 }.

我创建httpwebrequest对象罚款。然后致电 req.GetResponse(). 。一旦我这样做,我就会得到错误 The underlying connection was closed: The connection was closed unexpectedly. 我一直在谷歌搜索和检查stackoverflow,并尝试了我发现的所有适用的东西(其中很多与WCF服务配置有关,而不适用)。

这是我的代码:

Public Function GetJSON(ByRef d As db.Device) As Boolean
    Try
        d.Url = "http://" & d.IpAddress & ini.doc.<svc>.<url>.Value

        Dim req As HttpWebRequest = HttpWebRequest.Create(d.Url)
        // req.Accept = "*/*"
        // req.Timeout = 30000
        // req.ReadWriteTimeout = 30000
        // req.KeepAlive = False
        // req.UseDefaultCredentials = True
        // req.CachePolicy = HttpWebRequest.DefaultCachePolicy
        // req.Proxy = HttpWebRequest.DefaultWebProxy
        // req.ProtocolVersion = New System.Version(1, 0)

        Dim rsp As HttpWebResponse = req.GetResponse()

        Return True
    Catch ex As Exception
        Log(ex.Message)
        Return False
    Finally
        rsp = Nothing
        req = Nothing
    End Try
End Function

评论的线条(错误的评论样式,但可以正确解析)是我到目前为止根据我在网上发现的内容所尝试的。他们都没有修复它。我已经确认正在构建的URL是正确的。如果我在浏览器中调用完全相同的URL,它将给出正确的预期响应。

我已经尝试了将其定为witreshark ...我看到了实际预期的,完整的数据回到鲨鱼输出中,然后是几行,然后是一条红线,上面写着:http > 51943 [RST] Seq=1607 Win=0 Len=0 这是.NET丢弃错误之前要出现的最后一行。

我也尝试打开 System.Net 在此处和输出文件中,我看到所有预期的JSON数据的跟踪/记录 回来,但是回来后,它将这些行扔到.NET跟踪日志中:

System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive()   -> 1605#1605
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Receive()
System.Net.Sockets Verbose: 0 : [7040] Data from Socket#60467532::Receive
System.Net.Sockets Verbose: 0 : [7040] 00000000 :                                                 : 
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#60467532::Receive()   -> 0#0
System.Net.Sockets Verbose: 0 : [7040] Socket#60467532::Dispose()
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816:: - The underlying connection was closed: The connection was closed unexpectedly.
System.Net Error: 0 : [7040] Exception in the HttpWebRequest#27806816::GetResponse - The underlying connection was closed: The connection was closed unexpectedly.

任何想法要去哪里试图弄清楚这一点?我们正在从某些环境监视传感器设备中读取这些数据,它们为我们提供了使用此URL。

真正让我感到困惑的两件事是
a)在浏览器中调用时,它的工作正常
b)Wireshark和.NET跟踪都显示了所有数据 回来,由于某种原因,该框架是出于某种原因,除了收到所有数据之后!

WebException本身几乎没有用,因为其Innerexception是无效的,其状态仅表示“连接{8}”

提前致谢!!!

更新08/18 1130: 我也尝试过仅使用 System.Net.WebRequest 而不是 HttpWebRequest. 。这也没有任何区别。

更新08/18 1222: 我只是尝试切换代码而不是使用 [Http]Web[Request|Response] 调整一个 WebClient 而是对象并使用其 DownloadString() 方法。但是,这 引发相同的确切错误。

更新08/18 1230: 尝试使用 My.Computer.Network.DownloadFile() - 还会有相同的连接封闭错误。

有帮助吗?

解决方案

您可以在Pastebin.com上发布Trace Log的全部内容并在此处发布链接吗?

您可能会得到此例外,因为服务器可能会在“内容长度”标题中说出它正在发送实体的n个字节,但实际上是发送小于n个字节并关闭连接。

回答:

感谢您的数据。从Tracelog和Wireshark跟踪中,似乎服务器没有发送任何响应标头,而是直接发送数据。这是违反HTTP协议。这就是为什么客户抛出异常的原因。

其他提示

这是我如何工作的方式...感谢Feroze指向我的方向正确!
(授予积分)

Public Function GetJSON(ByRef d As db.Device) As Boolean
    Try
        Dim tcp = New TcpClient()
        tcp.Connect(d.IpAddress, 80)

        Dim ns = tcp.GetStream()

        Dim req As Byte() = System.Text.Encoding.ASCII.GetBytes(
            "GET /getdata.htm HTTP/1.1" & vbCrLf & vbCrLf
        )
        ns.Write(req, 0, req.Length)

        Dim rsp(2048) As Byte, rcv As Integer
        Do
            rcv = ns.Read(rsp, 0, rsp.Length)
            d.JSON &= System.Text.Encoding.ASCII.GetString(rsp, 0, rcv)
        Loop Until rcv = 0

        tcp.Close()

        Return True
    Catch ex As Exception
        Log(ex.Message)
        Return False
    End Try
End Function

这对我有帮助。我希望它也对某人有所帮助。

创建httpwebrequest对象后,添加此行。

system.net.servicepointmanager.securityprotocol = system.net.securityprotocoltype.ssl3;

它的含义将安全套接字层(SSL)3.0指定为安全协议

http://support.microsoft.com/kb/915599

检查请求的延迟。如果它超过几个ms,那么值得禁用纳格尔算法

 ServicePointManager.UseNagleAlgorithm = false;

关于没有身体的请求,我遇到了同样的问题。就我而言,设置 ContentLength 为零,解决了问题。

就我而言,问题是我们使用“ http:// ..”作为服务地址,而不是“ https://” ...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top