Deuxième appel à HttpWebRequest.GetRequestStream() throws exception délai
Aider... je ne peux pas comprendre pourquoi HttpWebRequest.GetRequestStream() est en train de jeter un délai d'attente
exception... il est TOUJOURS présent lorsque l'on essaie d'établir le second (et les suivantes)
les connexions à l'aide de POST. En gros, je suis en train de créer la connexion
toutes les 30 secondes. Voici la corporation de code:
Ma Boucle Principale:
for( int i = 0; i < students.Count; i++ ) {
Log( "Processing: " + students[i].DbID + ";" + students[i].Username + ";" + students[i].Password );
UserConnection uc = new UserConnection( students[i] );
uc.ParseAll();
Log( "Done Processing: " + students[i].DbID + ";" + students[i].Username + ";" + students[i].Password );
}
De La Connexion De L'Utilisateur:
public UserConnection( Student student )
{
this.student = student;
this.cookies = new CookieContainer();
this.InitCookies();
this.courses = new List<Course>();
}
private void InitCookies()
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create( baseUri );
req.Method = "GET";
req.CookieContainer = this.cookies;
req.GetResponse();
}
public void ParseAll()
{
ParseCourseInfo(); //get info for each class
.
.
.
}
private void ParseCourseInfo()
{
HtmlDocument page = GetPage( "POST", homeUri, "username=" + student.Username + "&password=" + student.Password + "&testcookies=1" );
.
.
.
}
L'exception suivante est présente dans GetPage:
29/07/2012 1:04:22 PM : Exception: System.Net.WebException
Message: The operation has timed out
Source: System
Stack Trace: at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at URCoursesParserV2.UserConnection.GetPage(String method, Uri pageUri, String queryString) in UserConnection.cs:line 167
Ici est la GetPage code où le problème est:
private HtmlDocument GetPage( string method, Uri pageUri, String queryString = "" )
{
Stream data = null;
HttpWebResponse res = null;
HttpWebRequest req = null;
try {
req = (HttpWebRequest)WebRequest.Create( pageUri );
req.CookieContainer = this.cookies;
req.Timeout = 1000 * 10; //10 seconds - I've also tried leaving it as default
req.KeepAlive = false; ////I've also tried leaving it as true.
if( method.ToUpper() == "POST" ) {
req.Method = "POST";
if( queryString != "" ) {
byte[] postBytes = Encoding.UTF8.GetBytes( queryString );
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = postBytes.Length;
using( data = req.GetRequestStream() ) { //////////////EXCEPTION HERE ON SECOND ITERATION
data.Write( postBytes, 0, postBytes.Length );
data.Close();
}
}
} else if( method.ToUpper() == "GET" ) {
req.Method = "GET";
if( queryString != "" ) {
pageUri = new Uri( pageUri.ToString() + '?' + queryString );
}
} else {
return null;
}
HtmlDocument page = null;
using( res = (HttpWebResponse)req.GetResponse() ) {
using( data = res.GetResponseStream() ) {
page = new HtmlDocument();
page.Load( data );
}
}
return page;
} catch(WebException e) {
URCoursesParser.Log( e );
return null;
} catch( Exception e ) {
URCoursesParser.Log( e );
return null;
} finally { ///data and res probably don't need to be checked here now because of 'using' blocks
if( data != null ) {
data.Close();
data = null;
}
if( res != null ) {
res.Close();
res = null;
}
if( req != null ) {
req.Abort();
req = null;
}
}
}
Des idées!?! La première itération est toujours beau. Si j'ai terminer le programme et redémarrez la première itération est de nouveau bien... C'est toujours le deuxième et les itérations suivantes.
OriginalL'auteur Cailen | 2012-07-29
Vous devez vous connecter pour publier un commentaire.
Cela pourrait être une partie du problème:
Ici, vous n'êtes pas à l'élimination de la réponse... il n'est donc pas le retour de la connexion à la piscine.
C'est pas vraiment clair ce que cette méthode est censé faire, mais vous devrait disposer de la réponse:
Ne serait-il pas initialiser les cookies si vous venez de définir plus tard, lorsque vous essayez d'envoyer un "réel" de la demande? Peut-être pas...
Merci Jon, quel catch.
Une fois de plus, Jon Skeet sauve la journée
Merci, Jon! J'ai été à regarder le présent code pour les deux jours! Très apprécié.
OriginalL'auteur Jon Skeet
J'ai eu un problème similaire, mais j'ai explicitement voulu quitter la méthode avant de l'attente de la réponse. Je définir le Délai d'attente de la demande à 100 millisecondes, et qui semblait le fixer pour moi.
OriginalL'auteur Abacus