C # HttpWebRequest expire après deux erreurs du serveur 500
Après je fais deux C# HttpWebRequests qui lève une exception en raison de "(500) Internal Server Error 500", la troisième tentative, lance un moment d'exception. Pourquoi ne pas jeter un autre (500) Erreur Interne du Serveur d'exception?
Lorsque je redémarre mon application, il jette deux erreurs 500 et commence alors le timing de nouveau.
C'est mon code:
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */
GetPages.Dispose();
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */
GetPages.Dispose();
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: time out, why? */
GetPages.Dispose();
C'est GetPages classe et GetPage méthode:
namespace MyNamespace
{
class GetPages
{
public string GetPage()
{
this.httpRequest = (HttpWebRequest)WebRequest.Create("http://myurl");
try
{
StringBuilder postData = new StringBuilder(100);
postData.Append("test=test");
byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());
httpRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
httpRequest.KeepAlive = false;
httpRequest.Proxy = null;
httpRequest.Method = "POST";
httpRequest.Timeout = 10;
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = dataArray.Length;
using (this.requestStream = httpRequest.GetRequestStream())
{
requestStream.Write(dataArray, 0, dataArray.Length);
requestStream.Flush();
requestStream.Close();
this.webResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
String responseString = responseReader.ReadToEnd();
MessageBox.Show(responseString);
return responseString;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return "FAIL";
}
}
public void Dispose()
{
System.GC.SuppressFinalize(this);
}
}
}
Mise à JOUR
Merci à vous tous pour nous aider. Je n'ai pas été en mesure de résoudre le problème.
La méthode dispose est maintenant disparu.
J'ai fait HttpWebRequest httpRequest, HttpWebResponse webResponse et Flux requestStream local et j'utilise la suite à l'aide des déclarations:
using (webResponse = (HttpWebResponse)httpRequest.GetResponse())
{
using (Stream responseStream = webResponse.GetResponseStream())
{
using (StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8))
{
responseString = responseReader.ReadToEnd();
}
}
}
Une autre mise à jour
C'est l'ensemble de la GetPage méthode maintenant:
public string GetPage()
{
HttpWebRequest httpRequest;
HttpWebResponse webResponse;
Stream requestStream;
try
{
StringBuilder postData = new StringBuilder(100);
postData.Append("test=test");
byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());
httpRequest = (HttpWebRequest)WebRequest.Create("http://myurl");
httpRequest.Proxy = null;
httpRequest.Method = "POST";
httpRequest.Timeout = 10;
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = dataArray.Length;
using (requestStream = httpRequest.GetRequestStream())
{
/* this is never reached when the time out exception starts
so the error seems to be related to too many GetRequestStreams */
requestStream.Write(dataArray, 0, dataArray.Length);
webResponse = (HttpWebResponse)httpRequest.GetResponse();
/* this is never reached when the 500 server error occurs */
String responseString = "";
using (Stream responseStream = webResponse.GetResponseStream())
{
using (StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8))
{
responseString = responseReader.ReadToEnd();
return responseString;
}
}
}
}
catch (Exception e)
{
return "FAIL";
}
return "...";
}
** RÉSOLU!! **
httpRequest n'a pas été prise en abort () " ed. Dans le catch() bloc j'ai ajouté httpRequest.abort(), maintenant il fonctionne correctement.
source d'informationauteur koen
Vous devez vous connecter pour publier un commentaire.
Je suspect c'est le problème:
Vous n'êtes pas à l'élimination de l'un de ces objets jetables. Cela signifie que la connexion au serveur web sera maintenu jusqu'à la finalisation, de sorte que le pool de connexion (de deux connexions par serveur) ne permettent pas à toutes les autres demandes.
Je suggère que:
GetResponse
appel de l'instruction à l'aide de la demande de fluxFlush
etClose
de la demande (flux de rebut, il est assez bon)webResponse
etwebRequest
des variables locales au lieu des variables d'instance, à moins que vous vraiment besoin d'eux plus tard, dans ce cas, vous devez disposer dans votreDispose
méthode.using
consolidés pour l'WebResponse
Stream
etStreamReader
. (La dernière n'est pas strictement nécessaire, d'éliminer le flux est assez bon.)GetPages
de ne pas mettre en œuvreIDisposable
à moins que vous vraiment besoin de.Protocole HTTP définit que seulement deux de connexion peut être faite en même temps sur le même serveur. Fermer la
responseStream
après le succès ou l'échec de la lecture.