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

时间:2010-08-16 21:36:24

标签: httpwebrequest httpwebresponse system.net.webexception

我有一个用VB.NET编写的应用程序( NOT 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,它会准确地返回正确的预期响应。

我已经尝试过将它弄糟......我看到实际预期的完整数据会在鲨鱼输出中返回,然后是几行,然后是一条红线,上面写着: 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.

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

真正让我迷惑的两件事就是那个 a)在浏览器中调用时,它完全正常 b)WireShark和.NET跟踪都显示实际 IS 的所有数据都会返回,并且框架出于某种原因除了收到所有数据之外!

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

提前致谢!!!

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

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

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

6 个答案:

答案 0 :(得分:5)

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

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

答案:

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

答案 1 :(得分: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

答案 2 :(得分:3)

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

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

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

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

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

答案 3 :(得分:0)

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

 ServicePointManager.UseNagleAlgorithm = false;

答案 4 :(得分:0)

关于没有正文的请求,我遇到了同样的问题。在我的情况下,将ContentLength设置为ZERO可以解决问题。

答案 5 :(得分:0)

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