9

我有一个用 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

注释掉的行(错误的注释样式,但 SO 会正确解析)是我迄今为止根据我在网上找到的所有内容。他们都没有修复它。我已经验证了正在构建的 URL 是正确的;如果我在浏览器中调用完全相同的 URL,它会返回完全正确的预期响应。

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

我还尝试在 SO 上的每个帖子中打开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 跟踪都显示所有数据实际上正在返回,并且框架出于某种原因除了 AFTER接收所有数据!

WebException 本身很少使用,因为它的 InnerException 为 null 并且它的状态只是说“ConnectionClosed {8}”

提前致谢!!!

更新 08/18 1130:我现在也尝试使用System.Net.WebRequestHttpWebRequest. 这也没有任何区别。

更新 08/18 1222:我只是尝试切换我的代码而不是使用[Http]Web[Request|Response]来调暗WebClient对象并使用它的DownloadString()方法。然而,这也会引发同样的错误。

更新 08/18 1230:尝试使用My.Computer.Network.DownloadFile()- 也得到相同的连接关闭错误。

4

6 回答 6

5

您可以在 pastebin.com 上发布跟踪日志的全部内容并在此处发布链接吗?

您可能会收到此异常,因为服务器可能在“Content-Length”标头中说它正在发送 N 个字节的实体,但实际上发送的字节数少于 N 个字节并关闭了连接。

回答:

谢谢你的数据。从tracelog和wireshark trace看,服务器似乎没有发送任何响应头,而是直接发送数据。这是 HTTP 协议违规。这就是客户端抛出异常的原因。

于 2010-08-17T20:33:13.030 回答
4

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

在您创建 HttpWebRequest 对象后,添加此行。

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;

这意味着将安全套接字层 (SSL) 3.0 指定为安全协议

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

于 2010-12-13T22:28:27.143 回答
3

这就是我的工作方式...感谢 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
于 2010-08-19T20:22:38.237 回答
0

检查请求的延迟。如果超过几毫秒,那么值得禁用 Nagle 算法

 ServicePointManager.UseNagleAlgorithm = false;
于 2014-02-06T19:33:11.267 回答
0

关于没有正文的请求,我遇到了同样的问题。就我而言,将 设置ContentLength为零可以解决问题。

于 2014-10-03T18:37:15.967 回答
0

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

于 2017-01-25T20:22:52.027 回答