2011-12-28 4 views
1

Я создал приложение C#, которое подключается к моему форуму phpBB и входит в систему. Теперь я пытаюсь использовать веб-клиент для перехода на страницу и захвата страницы в виде строки. Однако я продолжаю выходить из системы. Как использовать файл cookie, созданный кодом, используемым для входа в форум, в веб-клиенте?Оставайтесь на форуме

Код, используемый для входа на форум и получить страницу:

 public static CookieContainer login(string url, string username, string password, Form1 form) 
     { 
      if (url.Length == 0 || username.Length == 0 || password.Length == 0) 
      { 
       Console.WriteLine("Information missing"); 
       return null; 
      } 

      CookieContainer myContainer = new CookieContainer(); 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      request.CookieContainer = myContainer; 

      // Set type to POST 
      request.Method = "POST"; 
      request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"; 
      request.ContentType = "application/x-www-form-urlencoded"; 

      // Build the new header, this isn't a multipart/form, so it's very simple 
      StringBuilder data = new StringBuilder(); 
      data.Append("username=" + Uri.EscapeDataString(username)); 
      data.Append("&password=" + Uri.EscapeDataString(password)); 
      data.Append("&login=Login"); 

      // Create a byte array of the data we want to send 
      byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); 

      // Set the content length in the request headers 
      request.ContentLength = byteData.Length; 

      Stream postStream; 
      try 
      { 
       postStream = request.GetRequestStream(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Login - " + e.Message.ToString() + " (GRS)"); 
       return null; 
      } 

      // Write data 
      postStream.Write(byteData, 0, byteData.Length); 

      HttpWebResponse response; 
      try 
      { 
       response = (HttpWebResponse)request.GetResponse(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Login - " + e.Message.ToString() + " (GR)"); 
       return null; 
      } 

      bool isLoggedIn = false; 

      // Store the cookies 
      foreach (Cookie c in response.Cookies) 
      { 
       if (c.Name.Contains("_u")) 
       { 
        if (Convert.ToInt32(c.Value) > 1) 
        { 
         isLoggedIn = true; 

        } 
       } 
       myContainer.Add(c); 
      } 

      if (isLoggedIn) 
      { 

       string _url = "http://www.dandrews.net/forum/custom.php"; 
       string strResult = ""; 

       HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create(_url); 
       _request.CookieContainer = myContainer; 
       HttpWebResponse _response = (HttpWebResponse)_request.GetResponse(); 



       using (StreamReader sr = new StreamReader(_response.GetResponseStream())) 
       { 
        strResult = sr.ReadToEnd(); 
        // Close and clean up the StreamReader 
        sr.Close(); 
       } 
       form.userbox.Text = strResult; 

       return myContainer; 

      } 
      else 
      { 
       return null; 
      } 
     } 

ответ

1

Ваш помощью CookieContainer иначе, чем дизайн.

CookieContainer myContainer = new CookieContainer(); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.CookieContainer = new CookieContainer(); 

Должно быть:

CookieContainer myContainer = new CookieContainer(); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.CookieContainer = myContainer; 

Затем вы можете полностью удалить вашу логику, чтобы заполнить контейнер себя, потому что структура будет делать это за вас. Тогда просто обязательно используйте экземпляр myContainer во втором запросе, и он должен работать.

Update

Если вы должны использовать WebClient класс для второго запроса, вы можете проверить this question, чтобы помочь вам использовать CookieContainer с WebClient запросами.

Update

На основе вашего обновленного кода:

 public static CookieContainer login(string url, string username, string password) 
    { 
     if (url.Length == 0 || username.Length == 0 || password.Length == 0) 
     { 
      Console.WriteLine("Information missing"); 
      return null; 
     } 

     CookieContainer myContainer = new CookieContainer(); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.CookieContainer = myContainer; 

     // Set type to POST 
     request.Method = "POST"; 
     request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"; 
     request.ContentType = "application/x-www-form-urlencoded"; 

     // Build the new header, this isn't a multipart/form, so it's very simple 
     StringBuilder data = new StringBuilder(); 
     data.Append("username=" + Uri.EscapeDataString(username)); 
     data.Append("&password=" + Uri.EscapeDataString(password)); 
     data.Append("&login=Login"); 

     // Create a byte array of the data we want to send 
     byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); 

     // Set the content length in the request headers 
     request.ContentLength = byteData.Length; 

     Stream postStream; 
     try 
     { 
      postStream = request.GetRequestStream(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Login - " + e.Message.ToString() + " (GRS)"); 
      return null; 
     } 

     // Write data 
     postStream.Write(byteData, 0, byteData.Length); 

     HttpWebResponse response; 
     try 
     { 
      response = (HttpWebResponse)request.GetResponse(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Login - " + e.Message.ToString() + " (GR)"); 
      return null; 
     } 
     string _url = "http://www.dandrews.net/forum/custom.php"; 

     // Store the cookies 
     if (myContainer.GetCookies(new Uri(url)).Cast<Cookie>().Any(c => c.Name.Contains("_u"))) 
     { 
      string strResult = ""; 

      HttpWebRequest _request = (HttpWebRequest)HttpWebRequest.Create(_url); 
      _request.CookieContainer = myContainer; 
      HttpWebResponse _response = (HttpWebResponse)_request.GetResponse(); 

      using (StreamReader sr = new StreamReader(_response.GetResponseStream())) 
      { 
       strResult = sr.ReadToEnd(); 
       // Close and clean up the StreamReader 
       sr.Close(); 
      } 
      Console.WriteLine(strResult); 

      return myContainer; 
     } 
     else 
     { 
      return null; 
     } 
    } 
Смежные вопросы