我有一个用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()
尝试 - 也会收到相同的连接关闭错误。
答案 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指定为安全协议
答案 3 :(得分:0)
检查请求的延迟。如果它超过几毫秒,则值得禁用Nagle算法
ServicePointManager.UseNagleAlgorithm = false;
答案 4 :(得分:0)
关于没有正文的请求,我遇到了同样的问题。在我的情况下,将ContentLength
设置为ZERO可以解决问题。
答案 5 :(得分:0)
就我而言,问题是我们使用“http:// ..”作为服务地址而不是“https://”......