2012-07-29 3 views
4

Aide ... Je n'arrive pas à comprendre pourquoi HttpWebRequest.GetRequestStream() lance un timeout exception ... il se produit TOUJOURS lorsque vous essayez d'établir la seconde (et suite) connexions utilisant POST. Fondamentalement, j'essaye de créer la connexion toutes les 30 secondes. Voici le code relevent:Deuxième appel à HttpWebRequest.GetRequestStream() throws timeout exception

My Main Loop:

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 Connexion 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 INTERVENUES 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 

Voici le 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 bien. Si je termine le programme et redémarre la première itération est encore bien ... C'est toujours la deuxième itération et les suivantes.

Répondre

23

Cela pourrait faire partie du problème:

private void InitCookies() 
{ 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseUri); 
    req.Method = "GET"; 
    req.CookieContainer = this.cookies; 
    req.GetResponse(); 
} 

Ici, vous n'êtes pas disposer de la réponse ... il ne revient pas la connexion à la piscine.

Ce n'est pas vraiment clair que cette méthode vise à faire, mais vous devrait disposer de la réponse:

using (req.GetResponse()) {} 
+1

Vous êtes l'HOMME! J'aurais dû me sauver 4 heures muckin avec des trucs et je suis venu ici plus tôt. Ici, j'ai juste besoin d'établir une connexion pour initialiser certains cookies afin que je puisse me connecter pendant la demande de publication. – Cailen

+0

@Cailen: N'initialiserait-il pas les cookies si vous les définissez plus tard lorsque vous envoyez une "vraie" requête? Peut-être pas ... –

+0

Merci Jon, quel attrapé. –

1

J'ai eu un problème similaire, mais je voulais explicitement quitter la méthode avant d'attendre la réponse. J'ai mis le délai de la requête à 100 millisecondes, et cela a semblé le réparer pour moi.