httpWebRequest (La connexion sous-jacente a été fermée: la connexion a été fermée de manière inattendue.)
Je développe une application en C# qui enregistre les données à partir d'un serveur web. Il envoie une requête post au serveur et attend la réponse.
///<summary>
///Function for obtaining testCgi data
///</summary>
///<param name="Parameters"></param>
///<returns></returns>
private string HttpmyPost(string Parameters)
{
string str = "No response";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriTestCGI);
request.Method = "POST";
byte[] bytes = Encoding.UTF8.GetBytes(Parameters);
request.ContentLength = bytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);
try
{
var result = reader.ReadToEnd();
stream.Dispose();
str = result.ToString();
reader.Dispose();
}
catch (WebException ex)
{
//System.Windows.Forms.MessageBox.Show(ex.Message);
System.Diagnostics.Trace.WriteLine(ex.Message);
}
finally
{
request.Abort();
}
return str;
}
J'obtiens l'erreur
> "The underlying connection was closed: The connection was closed
> unexpectedly"
J'ai essayé de chercher l'erreur, et j'ai utilisé le violoneux, afin de vérifier la requête post donnée à partir de Firefox. À ma grande surprise, quand Fiddler était mon programme fonctionnait parfaitement. Quand je ferme les violoneux je vais avoir le même message d'erreur.
Je soupçonne que, depuis Fiddler agit comme un proxy, il peut modifier certains paramètres.
J'ai essayé d'utiliser le client web et le résultat était le même.
Quand j'ai essayé de codage de la demande en python, tout a fonctionné comme il se doit, sans aucun problème. De cource j'ai la possibilité d'installer des IronPython et de l'envelopper cette fonction particulière, cependant je considère que ce exagéré, et manquant d'élégance, donc je suis à la poursuite d'un maigre approche. J'imagine que ce n'est rien de plus qu'un paramètre d'ajustement.
J'ai essayé de modifier et dans mon cas, il est indifférent.
request.Accept
request.ReadWriteTimeout
request.Timeout
request.UserAgent
request.Headers
request.AutomaticDecompression
request.Referer
request.AllowAutoRedirect
//request.TransferEncoding
request.Expect
request.ServicePoint.Expect100Continue
request.PreAuthenticate
request.KeepAlive
request.ProtocolVersion
request.ContentType
Avec ou sans les ajustements ci-dessus le code fonctionne quand Fiddler est la capture de données.
Il peut aussi être de noter que le programme génère le message d'erreur à
WebResponse response = request.GetResponse();
Mise à JOUR:
Suivant @EricLaw suggestions j'ai regardé dans les temps de Latence.
J'ai trouvé cet article
HttpWebRequest devient plus lent lors de l'ajout d'un Intervalle de
qui a suggéré de transformer de l'Algorithme Nagle.
Maintenant, il n'y a pas fermé les connexions, même si il y a un petit décalage dans la réponse globale (quand j'utilise winforms, et pas async).
source d'informationauteur NMech
Vous devez vous connecter pour publier un commentaire.
J'écris un peu sur la façon Fiddler peut "comme par magie" arranger les choses ici: http://blogs.telerik.com/fiddler/posts/13-02-28/help!-en cours d'exécution-violoniste-corrige-mon-appli-
Le problème auquel vous êtes rencontre est en fait un bug dans le .NET Framework lui-même. Les règles de HTTP sont tels que le serveur peut fermer un KeepAlive connexion à tout moment après l'envoi de la première réponse (par exemple, il ne faut pas accepter une autre demande sur la connexion, même si le client a demandé KeepAlive comportement).
.NET a un bug où il s'attend à ce que le serveur va inclure un
Connection: close
en-tête de réponse si il va fermer la connexion après que la réponse est complète. Si le serveur ferme la connexion sansConnection: Close
en-tête (entièrement valide par la RFC2616), .NET rencontre la connexion fermée lorsque vous tentez d'envoyer la requête suivante sur la connexion et qu'il va jeter cette exception. Qu'est-ce .NET devrait faire silencieusement la création d'une nouvelle connexion et de renvoyer la demande sur cette nouvelle connexion.Fiddler résout ce problème, car il ne se soucie pas si le serveur ferme la connexion, et il maintient la connexion avec le client en vie. Lorsque le client envoie sa deuxième demande, Violoniste tente de réutiliser sa connexion au serveur, remarque qu'il est fermé, et en silence crée une nouvelle connexion.
Vous pouvez atténuer ce problème dans votre code par:
Approche #3 ne fonctionne que si vous contrôlez le serveur et parce que le client est peut-être derrière une passerelle ou proxy qui ferme les connexions après utilisation, vous devriez probablement utiliser une approche #2.
une suggestion et une question:
1) si vous voulez vraiment voir ce qu'il se passe sur installer Wireshark. Il va vous montrer exactement ce qui est envoyé /reçu. et il sera possible de comparer avec le violon.
Je suppose que vous êtes en manque un en-tête, comme le demande.ContentType = "...." mais seulement wireshark va vous montrer qui (est envoyé par l'intermédiaire de votre alternative de travail, alors que ne sont pas envoyés par votre HttpWebRequest).
2) êtes-vous d'obtenir l'erreur à l'intérieur du contenu de la réponse http, ou est-ce une exception, et si c'est une exception est-il pris dans vos prises, ou faut-il se produire lors de la demande, avant d'essayer votre déclaration?
Fiddler fonctionne comme un Proxy d'Internet. Si votre code fonctionne tout Fiddler est en cours d'exécution, (et peut-être aussi à partir d'un navigateur), alors vous pourriez avoir un problème avec les paramètres de votre proxy.