在HttpWebRequest上获得"底层连接已关闭"

eid*_*lon 8 httpwebrequest httpwebresponse system.net.webexception

我有一个用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
Run Code Online (Sandbox Code Playgroud)

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

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

我也试着打开System.Net此跟踪每一个岗位/记录的SO,并从我看到类似的所有预期的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.
Run Code Online (Sandbox Code Playgroud)

任何想法去哪里尝试解决这个问题?我们正在从一些环境监测传感器设备中读取这些数据,他们给了我们这个网址.

真正让我困惑的两件事就是
a)它在浏览器中调用时工作得很好
b)WireShark和.NET跟踪显示所有数据实际上都是IS回来了,框架是出于某种原因除了AFTER收到所有数据!

WebException本身很少使用,因为它的InnerException为null,其Status只显示"ConnectionClosed {8}"

提前致谢!!!

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

更新12月18日1822:我只是尝试切换我的代码,而不是使用[Http]Web[Request|Response]调暗WebClient对象而使用其DownloadString()方法.然而,这也会引发同样的错误.

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

fer*_*oze 5

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

你可能会得到这个异常,因为服务器可能在"内容长度",它是实体发送N个字节的头说,但比N个字节是实际发送少,关闭连接.

回答:

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

  • 另外,如果您无法修复服务器,那么我建议您直接使用Socket/TcpClient并读取响应JSON. (2认同)