2013-03-29 9 views
1

현재 C# 코드 (HttpWebRequest/HttpWebResponse)를 사용하여 로그인을 시뮬레이트하려하고 있지만 html 텍스트 대신 login.aspx 웹 페이지의 html 텍스트가 사용되었습니다. 로그인 성공. 반환 된 변수 'html'은 login.aspx 웹 페이지와 정확히 동일합니다. 데이터를 전혀 게시하지 않은 것처럼 보입니다. 도와주세요. 고맙습니다. 데이브. 여기에 내가 사용하는 코드가 있습니다C# 프로그래밍 코드를 사용하여 양식 로그인을 성공적으로 시뮬레이션하지 못했습니다.

var LOGIN_URL = "http://altech.com.au/login.aspx"; 

HttpWebRequest webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest; 
StreamReader responseReader = new StreamReader(
webRequest.GetResponse().GetResponseStream()); 
string responseData = responseReader.ReadToEnd(); 
responseReader.Close(); 

string postData =String.Format(
"ctl00$ContentPlaceHolderBodyMain$txtEmail {0}&ctl00$ContentPlaceHolderBodyMain$txtPassword={1}&btnLogin=Login","myemail", "mypassword"); 

//have a cookie container ready to receive the forms auth cookie 
CookieContainer cookies = new CookieContainer(); 

// now post to the login form 
webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest; 
webRequest.Method = "POST"; 
webRequest.ContentType = "application/x-www-form-urlencoded"; 
webRequest.CookieContainer = cookies; 
webRequest.UserAgent = "Mozilla/5.0 (Windows NT 5.2; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"; 

// write the form values into the request message 
StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream()); 
requestWriter.Write(postData); 
requestWriter.Close(); 

HttpWebResponse response2 = (HttpWebResponse)webRequest.GetResponse(); 
StreamReader sr2 = new StreamReader(response2.GetResponseStream(), Encoding.Default); 
string html = sr2.ReadToEnd(); 

답변

1

데이터를 URL 인코딩해야합니다. 그렇지 않으면 허용되지 않습니다.

Dictionary<string, string> FormData = new Dictionary<string, string>(); 

//Add all of your name/value pairs to the dictionary 
FormData.Add(
    "ctl00$ScriptManager1", 
    "ctl00$ContentPlaceHolderBodyMain..."); 

... 다음 올바르게 포맷하는 ...

public string GetUrlEncodedPostData(
    Dictionary<string, string> FormData) 
{ 
    StringBuilder builder = new StringBuilder(); 

    for (int i = 0; i < FormData.Count(); ++i) 
    { 
     //Better to use string.join, but this is a bit more clear ^_^ 
     builder.AppendFormat(
      "{0}={1}&", 
      WebUtility.UrlEncode(InputNameValue.ElementAt(i).Key), 
      WebUtility.UrlEncode(InputNameValue.ElementAt(i).Value)); 
    } 

    //Remove trailing & 
    builder.Remove(builder.Length - 1, 1); 

    return builder.ToString(); 
} 
+0

안녕 철, 나는 확실히 그것을 시도하고 내가 통해 얻을 수 있는지 여부를 확인합니다. 미리 감사드립니다. – user1629480

+0

안녕 철, 나는 그것을 테스트하고 여전히 성공적으로 기록 된 응답에서 HTML을 얻을 수 없습니다. 그런데 WebUtility.UrlEncode 대신 System.Web.HttpUtility.UrlEncode를 사용합니다. – user1629480

+0

PostData에 [viewstate]를 추가하면 내부 500 서버 오류가 발생합니다. – user1629480