Question

J'ai une demande écrite en VB.NET ( PAS asp.net, il est une application console Windows). Je suis en train d'appeler une URL (une page html) et retourner la réponse dans une chaîne. La réponse est JSON droit, sans balises html que ce soit. Il ouvre et ferme avec { avec }.

Je crée l'amende objet HttpWebRequest. Ensuite, appelez req.GetResponse(). Dès que je fais ce que je reçois le The underlying connection was closed: The connection was closed unexpectedly. d'erreur que j'ai été googler et la vérification stackoverflow, et tout essayé, je l'ai trouvé applicable (beaucoup de celui-ci doit faire avec des configurations de service WCF, qui ne sont pas applicables).

Voici mon 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

Les lignes commentées (mauvais style de commentaire, mais si il en sera de l'analyser à droite) sont toutes les choses que je l'ai essayé jusqu'à présent basé sur ce que j'ai trouvé en ligne. Aucun d'entre eux fixé il. J'ai vérifié que l'être construite URL est correcte; si je l'appelle exactement la même URL dans mon navigateur, il rend exactement la bonne réponse attendue.

Je l'ai essayé wiresharking ... et je vois les attendus réels, les données complètes reviennent dans la sortie de requin, puis quelques lignes, puis une ligne rouge qui dit: http > 51943 [RST] Seq=1607 Win=0 Len=0 qui est la dernière ligne de montrer avant .NET est de lancer l'erreur.

J'ai aussi essayé d'allumer System.Net traçage / exploitation forestière par un poste ici sur le SO, et dans le fichier de sortie que je vois de la même tous les données JSON attendues Finalité retour, mais après il revient il jette ces lignes dans le journal de trace .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.

Toutes les idées où aller pour essayer de comprendre cela? Nous lisons ces données sur certains dispositifs de capteurs de surveillance de l'environnement, et ils nous ont donné cette URL à utiliser.

Deux choses qui me suis vraiment et me confondre ce sont que
a) il fonctionne parfaitement bien quand appelé dans un navigateur
b) les deux WireShark et le traçage .NET afficher toutes les données réellement de retour, et le cadre est pour une raison quelconque sauf après avoir reçu toutes les données!

Le WebException lui-même est très peu utilisé, comme InnerException est nulle et son statut dit juste « ConnectionClosed {8} »

Merci d'avance !!!

Mise à jour 08/18 1130: J'ai aussi essayé maintenant en utilisant seulement System.Net.WebRequest par opposition à HttpWebRequest. Cela n'a pas fait non plus aucune différence.

Mise à jour 08/18 1222: Je viens d'essayer mon code de commutation au lieu d'utiliser [Http]Web[Request|Response] à gradation un objet WebClient au lieu et en utilisant sa méthode DownloadString(). Cependant, cela aussi lance la même erreur exacte.

Mise à jour 08/18 1230:. essayé d'utiliser My.Computer.Network.DownloadFile() - obtient également la même erreur fermée de connexion

Était-ce utile?

La solution

Pouvez-vous envoyer tout le contenu du journal de suivi sur pastebin.com et poster un lien ici?

Vous pourrait obtenir cette exception parce que le serveur pourrait dire l'en-tête « Content-Length » qu'il envoie N octets d'entité, mais envoie en fait inférieur à N octets et fermer la connexion.

Réponse:

Merci pour les données. De la trace tracelog et Wireshark, il semble que le serveur n'envoie les en-têtes de réponse, et l'envoi directement les données. Ceci est une violation du protocole HTTP. C'est la raison pour laquelle le client est de lancer l'exception.

Autres conseils

Voici comment je l'ai eu à travailler ... Merci à Feroze pour moi pointant dans la bonne direction!
(Les points attribués)

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

Cela me aide. J'espère que cela aide quelqu'un d'aussi bien.

Juste après la création HttpWebRequest objet, ajoutez cette ligne.

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

Ce que cela signifie est la couche de Précise Secure Socket (SSL) 3.0 comme protocole de sécurité

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

Vérifier la latence de la demande. S'il est plus que quelques ms alors il vaut la peine de désactiver l'algorithme Nagle

 ServicePointManager.UseNagleAlgorithm = false;

Je faisais la même question au sujet d'une demande sans corps. Dans mon cas, le réglage de la ContentLength à zéro résolu le problème.

Dans mon cas, le problème a été nous avons utilisé "http: // .." comme adresse de service au lieu de "https: //" ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top