La “connexion sous-jacente a été fermée” sur HttpWebRequest
J'ai une application écrite en VB.NET (PAS asp.net, c'est une Console Windows app). Je suis en train d'appeler une url (une page html) et de revenir à la réaction en chaîne de caractères. La réponse est directement JSON, pas de balises html que ce soit. Il s'ouvre avec {
et se ferme avec }
.
- Je créer l'objet HttpWebRequest amende. Appelez ensuite req.GetResponse()
. Dès que je fais ceci, j'obtiens le message d'erreur The underlying connection was closed: The connection was closed unexpectedly.
j'ai cherché sur google et la vérification de stackoverflow, et j'ai essayé tout ce que j'ai trouvé qui s'applique (beaucoup de cela a à faire avec le service WCF configurations, qui ne s'appliquent pas).
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
Le commentaire sur les lignes (mal de commentaires du style, mais il en sera de l'analyser à droite) sont toutes les choses que j'ai essayé jusqu'à présent fondée sur ce que j'ai trouvé en ligne. Aucun d'entre eux, il fixe. J'ai vérifié que l'URL en cours de construction est correcte; si je l'appelle exactement la même URL dans mon navigateur, il donne exactement la bonne réponse attendue.
J'ai essayé de connexion wireshark à l'... et je vois l'effectif prévu, les données complètes de revenir dans le requin de sortie, et ensuite, quelques lignes, puis une ligne rouge qui dit:
http > 51943 [RST] Seq=1607 Win=0 Len=0
qui est la dernière de la ligne à apparaître avant de .NET est en train de jeter de l'erreur.
J'ai aussi essayé de retourner sur System.Net
de suivi/journalisation par un post ici sur DONC, et dans le fichier de sortie à partir de ce que je vois de la même façon les données JSON ne revenir, mais après elle revient, elle jette ces lignes dans le .NET journal de suivi:
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.
Des idées où aller pour essayer de comprendre cela? Nous sommes à la lecture de ces données hors de l'environnement-suivi des dispositifs de détection, et ils nous ont donné cette url à utiliser.
Deux choses qui vraiment me chercher, et me confondre sur ce sont que
a) il fonctionne parfaitement bien lorsqu'il est appelé dans un navigateur
b) les deux WireShark et .NET traçage afficher toutes les données effectivement EST de retour, et le cadre est pour une raison quelconque à l'exception de APRÈS réception de toutes les données!
La WebException lui-même est très peu utilisé, comme son InnerException est nulle et son Statut dit juste "ConnectionClosed {8}"
Merci d'avance!!!
Mise à JOUR 08/18 1130: j'ai aussi essayé en utilisant simplement System.Net.WebRequest
par opposition à HttpWebRequest
. Cela ne faisait aucune différence non plus.
Mise à JOUR 08/18 1222: j'ai juste essayé le changement de mon code au lieu d'utiliser [Http]Web[Request|Response]
à la gradation d'un WebClient
objet au lieu et à l'aide de son DownloadString()
méthode. Toutefois, cette aussi jette la même erreur exact.
Mise à JOUR 08/18 1230: Essayé d'utiliser My.Computer.Network.DownloadFile()
- obtient également la même connexion fermée erreur.
- Voici un pastebin de mon réseau complet.journal .NET fichier de trace: pastebin.com/QfY05a11 . Vous pouvez voir toutes les données JSON retour à la ligne 41.
- Voici un pastebin de la Wireshark journal de trafic: pastebin.com/0hbEQerc . Vous pouvez voir les données de revenir sur la ligne de la 607.
Vous devez vous connecter pour publier un commentaire.
Pouvez-vous publier la totalité du contenu du journal de suivi sur pastebin.com et de poster un lien ici?
Vous avez peut-être cette exception, car le serveur peut dire dans "Content-length" (Longueur d'en-tête que c'est l'envoi de N octets de l'entité, mais qui est en fait l'envoi de moins de N octets et la fermeture de la connexion.
Réponse:
Merci pour les données. À partir de la tracelog et trace wireshark, il semble que le serveur n'est pas d'envoyer tout en-têtes de réponse, et d'envoyer directement les données. C'est un protocole HTTP violation. C'est pourquoi le client est en train de lancer une exception.
System.Net.WebRequest
de travail, par opposition à HttpWebRequest, vu que théoriquement il ne devrait pas être à la recherche pour les en-têtes HTTP, alors?WebRequest
objet au lieu deHttpWebRequest
, mais cela n'a pas aider. Il doit y avoir un moyen de le dire à l'accepter, peut-être en ajoutant des en-têtes ou quelque chose à ma Demande? Je suis aussi allé à mettre dans le code de disposer de mon objet de Réponse, et il n'a pas en fait uneDispose()
méthode, donc dans un bloc finally je viens de mettre les deux rsp et req à Rien.HttpWebResponse
objet: Peut-il être éliminé? Intellisense n'est pas de fournir l' .Méthode dispose ().Voici comment je l'ai eu à travailler... Grâce à feroze pour me pointer dans la bonne direction!
(points attribués)
tcp.Close()
devrait être appelée à partir de l'intérieur "enfin", sinon il ne sera pas appelé si il y a une exception avant le.Close()
appel.Cela m'aide. J'espère que cela aide quelqu'un d'aussi bien.
Juste après que vous créez l'Objet HttpWebRequest,
ajoutez cette ligne.
Système.Net.ServicePointManager.SecurityProtocol = Système.Net.SecurityProtocolType.Ssl3;
Ce que cela signifie, c'est spécifie le Secure Socket Layer (SSL) 3.0 en tant que protocole de sécurité
http://support.microsoft.com/kb/915599
Vérifier la latence de la demande. Si c'est plus que de quelques ms, alors il vaut la peine de la désactivation de l'Algorithme Nagle
J'ai eu le même problème 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é la "http://.." comme adresse de service au lieu de "https://"...