HttpResponse fonctionne-t-il dans un bloc "using" sans une response.close () explicite
-
05-07-2019 - |
Question
J'essayais d'obtenir des éclaircissements à ce sujet:
Méthode 1:
Dim request = CreateRequest(uri) //some uri
Dim response = DirectCast(request.GetResponse, HttpWebResponse)
response.Close()
Méthode 2:
Dim request = Createrequest(uri)
Using response = DirectCast(request.GetResponse, HttpWebResponse)
End Using
Lorsque j’utilisais à la fois les méthodes-1 et 2 sur mon ordinateur local pour établir une connexion et obtenir une réponse d’un ordinateur distant X, les deux fonctionnaient correctement.
Lorsque j'ai utilisé ce code sur une machine distante, Y pour obtenir une réponse de X, seule la méthode-1 fonctionne et pour Méthode-2, je reçois
.System.Net.WebException: The operation has timed out
Quelle est la différence entre les méthodes mentionnées ci-dessus et quel pourrait être le problème possible?
La solution
L'utilisation de
se traduit simplement par un bloc Essayer
/ Enfin
qui appelle .Dispose ()
dans le Enfin
bloquer. Vous pouvez utiliser Reflector pour rechercher le code généré. Vous pouvez également l'utiliser pour jeter un coup d'œil à ce qu'une méthode fait. Dans ce cas, la méthode Dispose ()
sur HttpWebResponse
ne ne fait pas la même chose que Close ()
, ce qui signifie il a en fait des différences sémantiques ici.
L'utilisation de
présente généralement l'avantage de libérer les ressources utilisées par un objet immédiatement lorsqu'il sort de la portée. Ceci est utile pour des choses comme GDI + ou les descripteurs de fichiers, mais dans le cas de HttpWebResponse
, cela pourrait être un peu différent. N'en sachant pas assez sur cet objet particulier, je suppose que Close ()
ne libère pas vraiment de ressources. Il n'est donc pas nécessaire d'appeler Dispose ()
< code> Fermer () aussi. Et peut-être y at-il des raisons valables à ce comportement.