2010-05-09 23 views
5

Próbuję zalogować się na stronie internetowej TV Rage i uzyskać kod źródłowy strony Moje programy. Pomyślnie się loguję (sprawdziłem odpowiedź z mojej prośby o wpis), ale kiedy próbuję wykonać żądanie pobierania na stronie Moje programy, jestem przekierowywany na stronę logowania.Zaloguj się do witryny i użyj pliku cookie, aby uzyskać źródło dla innej strony

Jest to kod używam do logowania:

private string LoginToTvRage() 
    { 
     string loginUrl = "http://www.tvrage.com/login.php"; 
     string formParams = string.Format("login_name={0}&login_pass={1}", "xxx", "xxxx"); 
     string cookieHeader; 
     WebRequest req = WebRequest.Create(loginUrl); 
     req.ContentType = "application/x-www-form-urlencoded"; 
     req.Method = "POST"; 
     byte[] bytes = Encoding.ASCII.GetBytes(formParams); 
     req.ContentLength = bytes.Length; 
     using (Stream os = req.GetRequestStream()) 
     { 
      os.Write(bytes, 0, bytes.Length); 
     } 
     WebResponse resp = req.GetResponse(); 
     cookieHeader = resp.Headers["Set-cookie"]; 
     String responseStream; 
     using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
     { 
      responseStream = sr.ReadToEnd(); 
     } 
     return cookieHeader; 
    } 

I potem zdać cookieHeader do tej metody, które powinny być coraz źródło moich występów strony:

private string GetSourceForMyShowsPage(string cookieHeader) 
    { 
     string pageSource; 
     string getUrl = "http://www.tvrage.com/mytvrage.php?page=myshows"; 
     WebRequest getRequest = WebRequest.Create(getUrl); 
     getRequest.Headers.Add("Cookie", cookieHeader); 
     WebResponse getResponse = getRequest.GetResponse(); 
     using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) 
     { 
      pageSource = sr.ReadToEnd(); 
     } 
     return pageSource; 
    } 

mam używałem this previous question jako przewodnika, ale nie rozumiem, dlaczego mój kod nie działa.

Odpowiedz

17

Oto uproszczona i działa wersja kodu za pomocą WebClient:

class Program 
{ 
    static void Main() 
    { 
     var shows = GetSourceForMyShowsPage(); 
     Console.WriteLine(shows); 
    } 

    static string GetSourceForMyShowsPage() 
    { 
     using (var client = new WebClientEx()) 
     { 
      var values = new NameValueCollection 
      { 
       { "login_name", "xxx" }, 
       { "login_pass", "xxxx" }, 
      }; 
      // Authenticate 
      client.UploadValues("http://www.tvrage.com/login.php", values); 
      // Download desired page 
      return client.DownloadString("http://www.tvrage.com/mytvrage.php?page=myshows"); 
     } 
    } 
} 

/// <summary> 
/// A custom WebClient featuring a cookie container 
/// </summary> 

public class WebClientEx : WebClient 
{ 
    public CookieContainer CookieContainer { get; private set; } 

    public WebClientEx() 
    { 
     CookieContainer = new CookieContainer(); 
    } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = base.GetWebRequest(address); 
     if (request is HttpWebRequest) 
     { 
      (request as HttpWebRequest).CookieContainer = CookieContainer; 
     } 
     return request; 
    } 
} 
+0

To jest doskonały! Dziękuję Ci bardzo! – Stu

Powiązane problemy