Frage

Ich habe eine Anwendung in VB.NET geschrieben ( nicht asp.net, es ist eine Windows-Konsole app). Ich versuche, eine URL (eine HTML-Seite) aufzurufen und die Antwort in einen String zurück. Die Antwort ist gerade JSON, keine HTML-Tags löschen. Es beginnt mit { und schließt mit }.

Ich schaffe das HttpWebRequest Objekt in Ordnung. Dann req.GetResponse() nennen. Sobald ich das mache ich den Fehler The underlying connection was closed: The connection was closed unexpectedly. erhalte ich habe googeln und Stackoverflow Kontrolle und versuchte alles, was ich habe festgestellt, dass gilt (eine Menge davon hat mit WCF-Service-Konfigurationen zu tun, die nicht gelten).

Hier ist mein Code:

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

Die kommentierten aus Linien (falsche Kommentar Stil, aber so wird es SO analysieren rechts) sind alle die Dinge, die ich versucht habe bisher auf das, was ich online gefunden habe. Keiner von ihnen fixiert es. Ich habe festgestellt, dass die eingebaute URL Wesen korrekt ist; wenn ich genau die gleiche URL in meinem Browser aufrufen gibt es wieder genau die richtige erwartete Antwort.

Ich habe wiresharking es versucht ... und ich sehe die tatsächlichen erwarteten vollständigen Daten wieder in der Hai-Ausgang, und dann ein paar Zeilen, und dann eine rote Linie, die sagt: http > 51943 [RST] Seq=1607 Win=0 Len=0, die die letzte Zeile ist bis zu zeigen, bevor .NET die Fehler zu werfen.

Ich habe auch versucht, auf System.Net Drehen Tracing / Anmeldung pro einem Post hier auf SO und in der Ausgabedatei aus, dass ich sehe, in ähnlicher Weise alle erwarteten JSON-Daten hat zurückkommen, aber nachdem er zurückkommt es wirft diese Zeilen in dem .NET-Trace-Protokoll:

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.

Alle Ideen, wohin sie gehen, zunächst versuchen diese, um herauszufinden? Wir lesen diese Daten aus einigen Umweltüberwachung Sensorvorrichtungen, und sie gaben uns diese URL zu verwenden.

Zwei Dinge, die Sie mich wirklich und verwirren mich dazu, dass
a) es funktioniert völlig in Ordnung, wenn sie in einem Browser
genannt b) sowohl Wireshark und .NET-Tracing alle tatsächlich die Daten zeigen, IS kommt zurück, und der Rahmen ist aus irgendeinem Grund mit Ausnahme Nachdem alle Daten empfangen!

Die WebException selbst ist sehr wenig Gebrauch zu sein, wie seine Innerexception ist null und sein Status sagt nur „ConnectionClosed {8}“

Vielen Dank im Voraus !!!

UPDATE 08/18 1130: Ich habe jetzt auch versucht, mit nur System.Net.WebRequest zu HttpWebRequest gegenüber. Dies machte keinen Unterschied entweder machen.

UPDATE 08/18 1222: ich meinen Code nur versucht Schale anstelle von [Http]Web[Request|Response] ein WebClient Objekt statt zu dimmen und seine DownloadString() Methode. Dies ist jedoch auch führt den exakt gleichen Fehler.

UPDATE 08/18 1230. Versucht My.Computer.Network.DownloadFile() mit - wird auch die gleiche Verbindung geschlossen Fehler

War es hilfreich?

Lösung

Können Sie den gesamten Inhalt des Trace-Protokoll auf pastebin.com veröffentlichen und einen Link hier posten?

Sie können diese Ausnahme bekommen, weil der Server in „Content-Length“ Kopf sagen könnte, dass es sendet N von Entity-Bytes, sondern sendet tatsächlich weniger als N Bytes und Schließen der Verbindung.

Antwort:

Danke für die Daten. Vom tracelog und wireshark Spur, so scheint es, dass der Server keine Antwort-Header sendet, und die Daten direkt zu senden. Dies ist eine HTTP-Protokollverletzung. Deshalb ist der Client die Ausnahme wirft.

Andere Tipps

Hier ist, wie ich habe es funktioniert ... Dank Feroze für mich in der richtigen Richtung!
(Punkte vergeben)

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

Das hilft mir. Ich hoffe, dass es jemand hilft auch.

Direkt nach HttpWebRequest Objekt erstellen, diese Zeile hinzufügen.

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

Was es bedeutet, gibt an die Secure Socket Layer (SSL) 3.0 als Sicherheitsprotokoll

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

Überprüfen Sie die Latenz des Antrags. Wenn es mehr als ein paar ms ist, dann ist es lohnt sich, den Nagle-Algorithmus zu deaktivieren

 ServicePointManager.UseNagleAlgorithm = false;

Ich hatte das gleiche Problem in Bezug auf eine Anfrage ohne Körper. In meinem Fall fixiert das ContentLength NULL-Setzen Sie das Problem.

In meinem Fall ist das Problem war, dass wir verwendet "http: // .." als Service-Adresse statt "https: //" ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top