2016년 11월 15일 화요일

[C#학원,닷넷학원,IT실무교육학원_탑크리에듀][강좌#7]HTTP와 닷넷(1)

무제 문서
이번 강좌에서는 .NET 에서의 HTTP에 관해서 알아 봅니다. 요즘은 거의 모든 것들이 HTTP와 관련이 있으므로 유용하게 이용될 수 있을것 같습니다.
표준 소켓이나 TCP 클래스를 이용하여 직접 HTTP 프로토콜을 구현 할 수 있지만 .NET 은 HTTP 서버와의 통신을 수행 할 수 있도록 설계된 다양한 클래스를 제공 합니다..( 주로 System.Net 네임스페이스 안에 있다 .) 이 클래스들은 일반적인 요청 응답 모델을 구현 하고 있으며 HTTP 전용 기능에 대하여 세밀한 제어가 가능 하도록 추가 속성을 가지고 있습니다.
Class
NameSpace
Base Class
Description
HttpWebRequest
System.Net
WebRequest
HTTP 요청을 나타냄
HttpWebResponse
System.Net
WebResponse
HTTP 응답을 나타냄
WebClient
System.Net
Component
파일이나 데이터를 URI 로 보낼 수 있고 , URI 로부터 데이터를 받을 수 있는 메소드 제공
Uri
System
MarchalByRefObject
URI 를 나타내며 호스트명과 절대경로와 같은 URI 의 구성 부분을 쉽게 이용 할 수 있다 .
UriBuilder
System
Object
Uri 객체를 생성하고 수정 할 수 있는 Utility 클래스
ServicePoint
System.Net
Object
주어진 Uri 에 대한 연결을 관리
ServiePointManager
System.Net
Object
ServicePoint 를 관리
--------------------------------
HttpWebRequest, HttpWebResponse
--------------------------------
.NET Framework 에서는 HTTP 를 간편하게 이용 할 수 있도록 HttpWebRequest 와 HttpWebResponse 를 기본 클래스로 제공합니다 . 우선 아래의 예제를 보도록 하죠^^;
using System;
using System.Net;
using System.IO;
using System.Text;
class SimpleWebRequest {
public static void Main () {
string query = "http://www.daum.net";
// 주어진 URI 를 조사 후 WebRequest 객체를 돌려 준다 .
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(query);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
// 인코딩의 확실 한 방법은 Content-Encoding 헤더를 읽어 그 인코딩으로 변환하는 것
StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.Default);
Console.WriteLine(sr.ReadToEnd());
res.Close();
sr.Close();
}
}
-------------------------
HTTP 헤더 설정 및 읽기
-------------------------
HttpWebRequest 와 HttpWebResponse 클래스는 Headers 라는 속성을 가지고 있으며 이 속성은 HTTP 메시지의 헤더에 대한 정보를 담고 있는 WebHeaderCollection 객체를 돌려 줍니다. Add() 나 Set() 을 호출하여 HTTP 요청에 헤더를 추가 할 수도 있습니다.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(“ http://www.daum.net ”);
req.Headers.Add(“Accept-Language:en-us”);
//req.Headers.Set(“Accept-Language”, “en-us”);
HttpWebRequest 클래스는 Headers 속성을 이용하지 않고 요청헤더를 설정 하도록 많은 public 속성을 가지고 있습니다.
속성
데이터 형식
HTTP 헤더
Accept
string
Accept
Connection
string
Connection
ContentLenth
long
Cotent-Length
ContentType
string
Content-Type
Expect
string
Expect
IfModifedSince
DateTime
If-Modified-Since
Referer
string
Referer
TranferEncoding
string
Tranfer-Encoding
UserAgent
string
User-Agent
헤더를 설정 하기 위한 속성이 있다면 이 속성을 사용 하지 않고 헤더를 설정하려 하면 런 타임 예외가 발생 한다 .
req.Headers.Add(“User-Agent: SimpleHttpClient”);
HttpWebResponse 객체의 속성은 아래와 갑습니다.
속성
데이터 형식
HTTP 헤더
ContentEncoding
string
Content-Encoding
ContentLenth
long
Cotent-Length
ContentType
string
Content-Type
LastModified
DateTime
Last-Modified
Server
string
Server
각 헤더 항목들은 WebHeaderCollection 에서 이름 - 값 쌍으로 이용 할 수 있으며 헤더의 이름이 컬렉션의 키가 되므로 헤더의 이름을 컬렉션이 인덱스로 사용 하여 헤더의 값을 이용 가능 합니다.
foreach(string header in res.Headers) {
Console.WriteLine({0} : {1}”, headers, res.Headers[header]);
}
---------------------
데이터의 게시
---------------------
게시판등에 글을 올리는 경우엔 POST 방식을 주로 이용 한다 .
HttpWenRequest 와 HttpWebResponse 를 이용하여 실제 게시판에 글을 올리는 C# 프로그램을 만들어 보기로 핮ㅅ , 아래의 예제를 참고하세요...
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;
class PostData {
static void Main () {
string URL = "http://localhost/oraclejava/multiboard/board/write_save.html";
StreamWriter sw = null;
string name = "jclee";
string email = "jclee@oraclejavanew.kr";
string title = " 열심히들 쓰고 있군요 ...";
string password = "1111";
string content = " 이건 내용 입니다 .";
string board_code = "freeboard";
string postData = "board_code=" + HttpUtility.UrlEncode(board_code) + "&" +
"name=" + HttpUtility.UrlEncode(name, Encoding.Default) + "&" +
"email=" + HttpUtility.UrlEncode(email) + "&" +
"title=" + HttpUtility.UrlEncode(title,Encoding.Default) + "&" +
"passwd1=" + HttpUtility.UrlEncode(password) + "&" +
"content=" + HttpUtility.UrlEncode(content,Encoding.Default);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL);
req.Method = "POST";
req.ContentLength = postData.Length;
req.ContentType = "application/x-www-form-urlencoded";
sw = new StreamWriter(req.GetRequestStream());
// 데이터를 인코딩
byte[] sendBuffer = Encoding.Default.GetBytes(postData);
// 데이터를 올리자 .
sw.Write(postData, 0, postData.Length );
//sw.Write(postData);
sw.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader srData = new StreamReader(res.GetResponseStream());
// 결과 스트림을 얻는다 .
string outHtml = srData.ReadToEnd();
Console.WriteLine(outHtml);
res.Close();
srData.Close();
}
}
---------------
HTTP Pipelining
---------------
HTTP 1.1 의 가장 중요한 기능 중의 하나가 바로 파이프 라이닝 입니다 . 이 기능을 통해 .NET 클래스들은 서버의 응답을 기다린 다음 요청을 전송하는 방식이 아니라 지속되는 연결을 사용하여 다수의 HTTP 요청을 백엔드 서버로 전송 할 수 있습니다 . 그러므로 파이브 라이닝이 가능하게 되면 서버에 여러 개의 리소스를 연결하는 애플리케이션은 시간이 오래 걸리는 리소스의 응답이 끝나기를 기다리는 위하여 대기하는 상태가 발생 하지 않죠 . 파이프라이닝은 기본적으로 활성화 되어 있지만 HttpWebRequest 의 Pipelines 속성을 false 로 하면 비 활성화 됩니다 .
----------------
HTTP 의 연결 유지
----------------
지속되는 연결 기능은 HTTP 1.0 에 소개된 기능으로 요청이 필요 할 때 마다 TCP 연결을 새로 생성하고 종료 하는 것이 아니라 서버에 기존의 TCP 연결을 유지 하면서 재사용이 가능 합니다 . Connection 헤더는 연결 유지 기능을 제어 하며 기본적으로 HTTP 1.1 에서는 연결은 모두 연결 유지 기능을 사용하는 것으로 간주 합니다 . 그러나 Connection:close 헤더를 사용 하면 연결을 종료 하며 기본적으로 HttpWebRequest 객체의 KeepAlive 속성을 true 로 설정하면 서버와 맺어진 연결을 계속 유지하며 서버는 연결유지 기능을 지원해야 합니다.

댓글 없음:

댓글 쓰기