728x90

C#에서는 WinHttp.WinHttpRequest.5.1대신하여 HttpWebRequest를 사용할 수 있다.


WinHttp.WinHttpRequest.5.1 에서는

MessageBox.Show(http.GetAllResponseHeaders()); 를 이용하여 헤더 정보값을 확인할 수 있는데


HttpWebRequest 에서는 GetAllResponseHeaders() 함수가 없다.

이거 알아내느라고 개고생했다. 구글링, 네이버 검색해도 정보가 잘 검색되지 않는다.

결국 확인해보니 모든 헤더정보를 보여주는게 아니라, 해당 헤더정보를 읽어낼 수 있게 되어 있었다.

response.GetResponseHeader("Set-Cookie");


해당 헤더 정보를 읽어서 원하는 정보를 파싱(추출)하여 원하는 결과를 얻어냈다.


HttpWebRequest 클래스 : https://msdn.microsoft.com/ko-kr/library/system.net.httpwebrequest.aspx

using System.Net

using System.IO

두개의 Namespace 를 선언한다.


데이터를 byte 단위로 가져오기 때문에 StreamReader 가 필요하다.

POST 방식은 ID와 패스워드(PW)를 입력받아 입력받은 정보로 request 를 보내고, 응답받은 결과 메시지를 확인하여 필요한 정보를 추출하여 로그인 성공/실패 처리를 하도록 한다.


private string doLogin(string ID, string PW)
{
    string url = "http://www.abc.com/";
    string PostData = string.Format("r=home&a=login&referer=%2F%3F&__target=_parent&id={0}&pw={1}", ID.Trim(), PW.Trim());

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    request.Referer = "http://www.abc.com/?r=home&system=iframe.login&iframe=Y&referer=%2F%3F";
    request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)";
    request.ContentType = "application/x-www-form-urlencoded";
    request.KeepAlive = true;
    request.AllowAutoRedirect = false;

    byte[] sendData = UTF8Encoding.UTF8.GetBytes(PostData);

    Stream dataStrem = request.GetRequestStream();
    dataStrem.Write(sendData, 0, sendData.Length);
    dataStrem.Close();

    string resResult = string.Empty;
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader readerPost = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8, true);   // Encoding.GetEncoding("EUC-KR")
    resResult = readerPost.ReadToEnd();
    //string cookie = response.GetResponseHeader("Set-Cookie"); // 쿠키정보 값을 확인하기 위해서
    //MessageBox.Show(cookie);
    //MessageBox.Show(resResult);
    readerPost.Close();
    response.Close();

    CK = false;
    if (resResult.IndexOf("패스워드가 일치하지 않습니다.") > 0)
    {
        MessageBox.Show("패스워드가 틀렸습니다", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        this.txtPwd.Focus();
    }
    else if (resResult.IndexOf("history.go(-1);//]]>") <= 0)  // 웹페이지 메세지가 없으면
    {
        if (response.GetResponseHeader("Set-Cookie").IndexOf("PHPSESSID=") != -1// 값이 없으면 - 1을 반환
        {
            CK = true;
            string strSessionID = SSplit(SSplit(response.GetResponseHeader("Set-Cookie"), "PHPSESSID=", 1), ";", 0);
            strID = txtID.Text;
            return strSessionID;
        }
    }
    return strID;  // 패스워드가 틀릴 경우에는 입력되는 ID값을 전달 받지 못하므로 null
}


// 엑셀 VBA 함수 Split 처럼 함수로 만들어서 사용

public static string SSplit(string _body, string _parseString, int index)
{
    string varTemp = _body.Split(new string[] { _parseString }, StringSplitOptions.None)[index];
    return varTemp;
}



ID가 null 인 경우에는 다음 단계 진행이 안되도록 처리


private void MainForm_Load(object sender, EventArgs e)
{
    frmLogin f2 = new frmLogin();  // 클래스 이름
    f2.ShowDialog();
    if (f2.getstrID == null)  // ID 입력값이 없으면 종료처리
    {
        Application.Exit();
    }
    else
    {
        this.Text = "접속 ID : " + f2.getstrID;
        this.WindowState = FormWindowState.Maximized;
        status_date(); 

        // 기본 처리할 내용 처리
    }
}


블로그 이미지

Link2Me

,