달력

082010  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  
안녕하세요!!
이번에는 HttpWebRequest 를 편하게 사용할 수 있도록 Helper 클래스를 작성해보도록 하겠습니다.
HttpWebRequest 는 1.1에서 2로 넘어오면서 사용방법이 변경된것을 아실겁니다.
좀 복잡해 졌죠^^ 변경된 내용은 MSDN : Breaking Changes in Silverlight 2에서 BrowserHttpWebRequest Removed 부분을 참고하시면 됩니다.
그리고 이번 강좌는 위 MSDN 내용과 CameronAlbert.comHttpWebRequest Helper for Silverlight 2의 내용을 참고했습니다.

Silverlight 2용 HttpWebRequest Helper Class 만들기

1. HttpHelper 클래스 작성

그럼 일단 HttpWebRequest Helper 클래스를 작성해 보겠습니다.
클래스명은 HttpHelper로 하고 파일명은 HttpHelper.cs로 하겠습니다.
어려운 내용은 없으니 소스 위주로 진행을 하도록 하겠습니다!!

실버라이트 프로젝트에서 추가 -> 실버라이트 클래스를 추가하여 주시기 바랍니다.

이 Helper 클래스는 기본 클래스, Method enum, 2개의 이벤트 핸들러를 사용합니다.

추가 Namespace

using System.IO;
using System.Net;
using System.Collections.Generic;

Method enum

public enum Method
{
    Post,
    Get
}

Response 완료 이벤트

public delegate void HttpResponseCompleteEventHandler(HttpResponseCompleteEventArgs e);
public class HttpResponseCompleteEventArgs : EventArgs
{
    public string Response { get; set; }
    public HttpResponseCompleteEventArgs(string response)
    {
        this.Response = response;
    }
}

Error 이벤트

public delegate void HttpErrorEventHandler(HttpErrorEventArgs e);
public class HttpErrorEventArgs : EventArgs
{
    public string Error { get; set; }
    public HttpErrorEventArgs(string error)
    {
        this.Error = error;
    }
}

이제부터 기본 HttpHelper 클래스를 작성하겠습니다.

전역

private HttpWebRequest Request { get; set; }
public Dictionary<string, string> PostValues { get; private set; }

public event HttpResponseCompleteEventHandler ResponseComplete;
private void OnResponseComplete(HttpResponseCompleteEventArgs e)
{
    if (this.ResponseComplete != null)
    {
        this.ResponseComplete(e);
    }
}

public event HttpErrorEventHandler Error;
private void OnError(HttpErrorEventArgs e)
{
    if (this.Error != null)
    {
        this.Error(e);
    }
}

생성자

public HttpHelper(Uri requestUri, Method method, params KeyValuePair<string, string>[] postValues)
{
    this.Request = (HttpWebRequest)WebRequest.Create(requestUri);
    this.Request.ContentType = "application/x-www-form-urlencoded";
    this.Request.Method = method.Equals(Method.Post) ? "POST" : "GET";
    if (postValues.Length > 0)
    {
        this.PostValues = new Dictionary<string, string>();
        foreach (var item in postValues)
        {
            this.PostValues.Add(item.Key, item.Value);
        }
    }
}

헤더 설정

public void SetHeader(string name, string value)
{
    this.Request.Headers[name] = value;
}

실행

public void Execute()
{
    try
    {
        this.Request.BeginGetRequestStream(new AsyncCallback(RequestCallback), this.Request);
    }
    catch (Exception ex)
    {
        OnError(new HttpErrorEventArgs("Execute : " + ex.Message));
    }
}

Request Callback

private void RequestCallback(IAsyncResult asyncResult)
{
    HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
    if (request != null)
    {
        try
        {
            if ((PostValues != null) && (PostValues.Count > 0))
            {
                using (StreamWriter writer = new StreamWriter(request.EndGetRequestStream(asyncResult)))
                {
                    foreach (var item in PostValues)
                    {
                        writer.Write("{0}={1}&", item.Key, item.Value);
                    }
                }
            }
            request.BeginGetResponse(new AsyncCallback(ResponseCallback), request);
        }
        catch (Exception ex)
        {
            OnError(new HttpErrorEventArgs("RequestCallback : " + ex.Message));
        }
    }
}

Response Callback

private void ResponseCallback(IAsyncResult asyncResult)
{
    HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
    if (request != null)
    {
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);
            if (response != null)
            {
                Stream stream = response.GetResponseStream();
                if (stream != null)
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        OnResponseComplete(new HttpResponseCompleteEventArgs(reader.ReadToEnd()));
                    }
                    stream.Close();
                }
                else
                {
                    OnResponseComplete(new HttpResponseCompleteEventArgs("StatusCode : " + response.StatusCode));
                }
                response.Close();
            }
        }
        catch (Exception ex)
        {
            OnError(new HttpErrorEventArgs("ResponseCallback : " + ex.Message));
        }
    }
}

이렇게 해서 HttpHelper 클래스를 모두 작성했습니다.

2. HttpHelper 클래스 사용방법

HttpHelper 클래스를 사용하는 방법의 몇가지 예를 들어서 설명을 하도록 하겠습니다.
그리고 요청할 URL이 같은 서버이거나 크로스 도메인이 허용된 경우에만 접근이 가능합니다.
다른 도메인에 접근을 했는데 Status Code가 Not Found가 나오면 클로스 도메인이 허용이 안된 사이트입니다.
참고 : 도메인 영역을 넘을 수 있는 서비스 만들기

예제1) 파라미터가 없는 요청

HttpHelper helper = new HttpHelper(
    new Uri("http://localhost/Test/Default.aspx"),
    Method.Post);
helper.ResponseComplete += new HttpResponseCompleteEventHandler(helper_ResponseComplete);
helper.Error += new HttpErrorEventHandler(helper_Error);
helper.Execute();

예제2) 파라미터가 1개인 요청

HttpHelper helper = new HttpHelper(
    new Uri("http://localhost/Test/Default.aspx"),
    Method.Post,
    new KeyValuePair<string, string>("key", "value"));
helper.ResponseComplete += new HttpResponseCompleteEventHandler(helper_ResponseComplete);
helper.Error += new HttpErrorEventHandler(helper_Error);
helper.Execute();

예제3) 파라미터가 2개 이상인 요청

HttpHelper helper = new HttpHelper(
    new Uri("http://localhost/Test/Default.aspx"),
    Method.Post,
    new KeyValuePair<string, string>("key", "value"),
    new KeyValuePair<string, string>("key2", "value2")); //이와 같이 계속 추가하면 됩니다.
helper.ResponseComplete += new HttpResponseCompleteEventHandler(helper_ResponseComplete);
helper.Error += new HttpErrorEventHandler(helper_Error);
helper.Execute();

예제4) 헤더가 존재하는 요청

HttpHelper helper = new HttpHelper(
    new Uri("http://localhost/Test/Default.aspx"),
    Method.Post);
helper.ResponseComplete += new HttpResponseCompleteEventHandler(helper_ResponseComplete);
helper.Error += new HttpErrorEventHandler(helper_Error);
helper.SetHeader("Authorization", "Basic ***************");
helper.Execute();

이벤트 처리

void helper_Error(HttpErrorEventArgs e)
{
    txtLog.Text = "에러 : " + e.Error;
}
void helper_ResponseComplete(HttpResponseCompleteEventArgs e)
{
    txtLog.Text = "완료 : " + e.Response;
}

이상으로 HttpHelper 클래스를 작성하고 사용하는 방법까지 알아보았습니다.
위에 작성한 HttpHelper가 필요하신 분은 다운로드 하시기 바랍니다.

HttpHelper.cs 파일 다운로드


작성자 : 상현넘™ [http://www.shblitz.net]
Posted by 상현넘™

댓글을 달아 주세요

  1. 양기영  댓글주소 수정/삭제 댓글쓰기 2010/02/17 21:43

    안녕하세요~ 작성하신 HttpHelper 클래스를 통해서 많은 도움을 받았습니다.^^
    먼저 감사드립니다.
    의문이 있어 한가지 질문을 드리려고 합니다.
    Execute() 메서드 내의 this.Request.BeginGetRequestStream() 호출 시
    System.Net.ProtocolViolationException이 발생하는데요..
    request 와 response에서 무언가 문제가 있나 싶어 디버깅을 해보았으나 해당 루틴까지
    넘어가지도 않은채 예외를 리턴하며 아무 반응이 없더군요..
    혹시 이점에 대하여 경험이나 노하우가 있으신지 여쭤봅니다.
    앞으로도 게시글 및 자료 참고하여 공부에 많은 도움이 될 듯 합니다.
    감사합니다.