2012-11-01 1 views
1

저녁에 좋은 부분을 보냈는데 무엇이 잘못되었는지 알 수 없습니다. 데이터가 로그인 페이지에 게시되고 잘 처리됩니다. 잘못된 로그인/pwd가 오류 페이지로 표시되고 성공한 페이지는 "위치"헤더와 함께 빈 응답을 얻습니다. 그러나 거기에 가려고하거나 다른 보호 된 페이지는 로그인 페이지를 반환합니다. 나는 어딘가에 사소한 일을 놓쳐 버린 것 같아. 아래는 실제 코드를 제외한 전체 코드입니다. 나는 누군가가 잘못 :)HttpWebRequest/HttpWebResponse CookieContainer를 사용하지 않고 로그인하는 중

$class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      var cookieContainer = new CookieContainer(); 
      var username = "user"; 
      var password = "pwd"; 

      // LOGIN 
      Console.WriteLine("Logging in..."); 

      var postData = string.Format("username={0}&password={1}&remote=&action=auth&submit=Login&from=", username, password); 
      var req = (HttpWebRequest)WebRequest.Create("https://freedns.afraid.org/zc.php"); 
      req.CookieContainer = cookieContainer; 
      req.Method = "POST"; 
      req.ContentLength = postData.Length; 
      req.ContentType = "application/x-www-form-urlencoded"; 

      // This is necessary to capture cookies 
      // The response will contain a "Location" header for redirect 
      req.AllowAutoRedirect = false; 

      req.KeepAlive = true; 
      req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"; 

      var encoding = new ASCIIEncoding(); 
      var loginDataBytes = encoding.GetBytes(postData); 
      req.ContentLength = loginDataBytes.Length; 
      var stream = req.GetRequestStream(); 
      stream.Write(loginDataBytes, 0, loginDataBytes.Length); 

      var webResp = (HttpWebResponse)req.GetResponse(); 

      var datastream = webResp.GetResponseStream(); 
      if (datastream == null) { throw new Exception("Data stream is null."); } 

      var reader = new StreamReader(datastream); 
      var response = reader.ReadToEnd(); 

      if (response.IndexOf("Invalid UserID/Pass") != -1) { throw new Exception("Invalid user/password."); } 
      if (response.IndexOf("must enable cookies") != -1) { throw new Exception("Cookies not enabled."); } 

      // ACCESS PAGE 
      Console.WriteLine("Accessing page..."); 

      req = (HttpWebRequest)WebRequest.Create("https://freedns.afraid.org/dynamic/"); 
      req.CookieContainer = cookieContainer; 
      req.Method = "GET"; 
      req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"; 

      webResp = (HttpWebResponse)req.GetResponse(); 

      datastream = webResp.GetResponseStream(); 
      if (datastream == null) { throw new Exception("No response received."); } 

      reader = new StreamReader(datastream); 
      response = reader.ReadToEnd(); 
      Console.WriteLine(response); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      Console.ReadKey(); 
     } 
    } 
} 
+0

웹 요청을 할 때 브라우저를 통해 액세스하는 것과는 별도입니다. 따라서 웹 요청을 사용하여 로그인하면 웹 요청 내에서만 유효합니다. 브라우저를 통해 요청을하면 여전히 로그인해야합니다. –

답변

0

당신은 [email protected]#$%^&*()_+<>?:;"'{[}]|\ 같은 특수 문자를 작성하기 위해 HttpUtility.UrlEncode(string)를 사용해야 할 수도 있습니다 무엇의 몇 가지 아이디어를 가지고 희망

당신은 프로젝트와에 대한 참조로이를 추가해야합니다

잘 네임 스페이스에서 그것을 참조하는 것으로.

+0

HTTP 유틸리티에 대한 참조는 System.Web입니다. –