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();
// 기본 처리할 내용 처리
}
}
'C# > 문법 및 기능' 카테고리의 다른 글
C# 파일 다중선택 열기(OpenFileDialog) (3) | 2015.12.01 |
---|---|
C# 파일 복사(File Copy) - 중복체크 (0) | 2015.11.22 |
C# URL 경로 링크 (0) | 2015.11.10 |
C# Timer.Tick 이벤트, 이벤트 분석 (0) | 2015.10.22 |
C# 밀리초 단위를 받아서 시/ 분/초 단위로 표시 (0) | 2015.10.18 |