1 Results for 'HttpWebResponse'

  1. 2007.07.15 [Silverlight] QuickStarts, HTTP를 통한 Plain XML 수신 (8)
Silverlight 1.1 바로 시작하기

HTTP를 통한 Plain XML 수신
준비 사항
Silverlight 개발의 기초에서 개발에 필요한 도구와 기술에 대해 설명하고 있습니다.
이벤트 핸들링에서 개체의 이벤트를 처리하는 방법에 대해 설명하고 있습니다.
디버깅과 예외처리에서 Web Application 프로젝트와 Silverlight Application 프로젝트를 연동하는 방법을 소개하고 있습니다.

Silverlight에서의 HTTP Request

XML 메시지와 HTTP Request
Plain XML(이하 POX -Plain Old XML-) 메시지는 SOAP이나 WS-*등의 프로토콜을 지원하지 않는 클라이언트에서도 폭넓게 사용할 수 있습니다. 또한 HTTP 프로토콜 상에서 쉽게 전송될 수 있으며 수신된 데이터를 보다 구조적으로 분석할 수 있으므로 단순한 데이터 교환에 좋은 선택이 됩니다.

Silverlight에서 POX 메시지는 새로운 BrowserHttpWebRequest 클래스를 사용하여 요청을 전송하고 HttpWebResponse 클래스를 사용하여 데이터를 수신할 수 있습니다.
노트
BrowserHttpWebRequest 클래스는 현재 크로스도메인에 대한 접근을 허용하지 않습니다. 따라서 BrowserHttpWebRequest로 요청하는 URI는 반드시 실버라이트 페이지와 같은 서버에 존재해야 합니다.

동기적(Synchronously)으로 송수신하기
동기적인 Web Request를 사용하면 간단한 코드로 요청에 대한 응답을 수신하고 수신 받은 응답으로부터 스트림으로 데이터를 얻을 수 있습니다.
Howto : POX 메시지를 동기적으로 수신하는 방법
1. 우선 전송할 xml 파일을 작성합니다. 파일의 이름은 test.xml이라고 하고 내용은 다음과 같으며 실버라이트 페이지와 같은 경로에 작성합니다.
test.xml
<?xml version="1.0" encoding="utf-8" ?>
<List>
    <Item>
        <Name>test name1</Name>
        <Address>test address1</Address>
    </Item>
    <Item>
        <Name>test name2</Name>
        <Address>test address2</Address>
    </Item>
</List>

2. 버튼으로 사용할 TextBlock과 결과를 출력할 TextBlock을 마크업에 올려 놓습니다.
XAML
<TextBlock x:Name="btnSync" Text="Request Synchronously" />
<TextBlock x:Name="txtResult" Text="" Canvas.Top="30" />

3. 코드-비하인드에 HttpWebRequest와 HttpWebResponse 및 Stream을 위한 네임스페이스를 추가합니다.
C#
using System.Net;
using System.Windows.Browser.Net;
using System.IO;

4. 코드-비하인드에 버튼에 대한 이벤트 핸들러를 추가하고 XML 메시지를 요청하는 코드를 작성합니다.
C#
public void Page_Loaded(object o, EventArgs e)
{
    // Required to initialize variables
    InitializeComponent();
    btnSync.MouseLeftButtonDown += new MouseEventHandler(btnSync_MouseLeftButtonDown);
}

void btnSync_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
    // URI Request.
    Uri uri = new Uri("test.xml", UriKind.Relative);
    BrowserHttpWebRequest request = new BrowserHttpWebRequest(uri);
}

5. 곧바로 XML 메시지를 수신하여 디버그 창에 표시하는 코드를 작성합니다. 위의 코드에서 request를 생성한 코드 아랫줄에 계속 입력합니다. 수신 내용을 표시하는 코드는 별도의 프로시저로 작성합니다.
C#
void btnSync_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
    // URI Request.
    Uri uri = new Uri("test.xml", UriKind.Relative);
    BrowserHttpWebRequest request = new BrowserHttpWebRequest(uri);

    // Request로부터 Response를 수신합니다.
    HttpWebResponse response = request.GetResponse();
    // Response를 덤프하고 닫습니다.
    DumpResponse(response);
    response.Close();
}

private static void DumpResponse(HttpWebResponse response)
{
    // 수신이 완료되지 않으면 예외를 던집니다.
   
if (response.StatusCode != HttpStatusCode.OK)
    {
        throw new ApplicationException("Status not OK : " + response.StatusCode.ToString());
        return;
    }

    // response의 스트림을 문자열로 읽습니다.
    StreamReader sr = new StreamReader(response.GetResponseStream());
    string rawResponse = sr.ReadToEnd();

    // 출력합니다.
    txtResult.Text = rawResponse;
}




비동기적(Asynchronously)으로 송수신하기
동기적인 송수신은 Request를 전송하고 수신 받기 까지 실버라이트 런타임이 어떤 코드도 처리를 하지 못하게 되고 따라서 그 시간 동안 Freezing(화면 멈춤) 현상이 나타나게 됩니다. 따라서 수신 받을 데이터가 크거나 네트워크의 속도가 충분히 빠르지 않을 때에는 반드시 비동기적인 송수신을 수행해야 하며, 그렇지 않을 경우에도 가급적 비동기적인 송수신을 수행하는 것이 좋습니다.

비동기적인 송수신은 비동기 CallBack을 사용하여 구현됩니다.

Howto : POX 메시지를 비동기적으로 수신하는 방법
1. 위에서 작성한 동기적으로 송수신하기 프로젝트에서 다음과 같은 코드들을 추가합니다.

2. 버튼으로 사용할 TextBlock을 마크업에 추가합니다.
XAML
<TextBlock x:Name="btnAsync" Text="Request Asynchronously" Canvas.Left="300" />

3. 코드-비하인드에 버튼에 대한 이벤트 핸들러를 추가하고 XML 메시지를 요청하는 코드를 작성합니다. Request 개체는 비동기적으로 수행되므로 클래스의 멤버 변수로 미리 선언합니다.
C#
HttpWebRequest _asyncRequest;
 
public void Page_Loaded(object o, EventArgs e)
{
    // Required to initialize variables
    InitializeComponent();
    btnSync.MouseLeftButtonDown += new MouseEventHandler(btnSync_MouseLeftButtonDown);
    btnAsync.MouseLeftButtonDown += new MouseEventHandler(btnAsync_MouseLeftButtonDown);

}

void btnAsync_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
    // URI를 생성하고 Request를 작성한 후 Request에 대한 비동기 수신자를 등록합니다.
    Uri uri = new Uri("test.xml", UriKind.Relative);
    _asyncRequest = new BrowserHttpWebRequest(uri);
    IAsyncResult iar = _asyncRequest.BeginGetResponse(new AsyncCallback(OnResponseDownload), _asyncRequest);
}

5. Response가 완료되었을 때 처리할 프로시저 OnResponseDownload를 작성합니다.
C#
// 비동기적인 송수신
private void OnResponseDownload(IAsyncResult iar)
{
    // 응답 다운로드를 종료하고 참조를 획득합니다.
    HttpWebResponse response = (iar.AsyncState as HttpWebRequest).EndGetResponse(iar);

    // Response를 덤프하고 닫습니다.

    DumpResponse(response);
    response.Close();
}


Web Application으로 로컬에서 테스트하기

HttpWebRequest/Response
HttpWebRequest와 HttpWebResponse 클래스는 그 이름이 말하는 것과 같이 HTTP 프로토콜을 통해 전달됩니다. 때문에 다른 코드와 달리 로컬에서 실행하는 실버라이트 애플리케이션에서 이 클래스를 사용할 경우 예외를 발생시킵니다.

따라서 HttpWebRequest/Response와 같은 HTTP 프로토콜을 이용하는 클래스나 코드를 테스트하기 위해서는 실제 웹서버에서 직접 테스트하거나 디버깅과 예외처리에서 소개한 것과 같이 Web Application프로젝트를 추가하여 Web 애플리케이션에서 테스트해야 합니다. 여기에서는 웹서버 없이 로컬에서 사용가능한 후자의 방법에 대해 알아보겠습니다.
Howto : Web Application을 추가하고 로컬에서 테스트하는 방법
1. 위에서 작성된 프로젝트의 솔루션에서 마우스 오른쪽 클릭을 한 후 Add-> New Project를 선택합니다.


2. 원하는 형태의 새 Web Application 프로젝트 타입을 선택하고 생성합니다.


3. 디버깅과 예외처리를 참고하여 위에서 작성된 실버라이트 프로젝트를 링크하고 디버그 할 수 있도록 설정합니다. 웹 애플리케이션의 Deafult.aspx에 링크한 실버라이트 페이지를 보여줄 수 있도록 초기화 코드를 추가하고 새 웹 애플리케이션 프로젝트를 시작 프로젝트로 설정합니다. 또한 위에서 작성한 test.xml도 미리 웹 애플리케이션의 루트에 복사해 놓습니다.

최종적으로 새 웹 애플리케이션 프로젝트는 다음과 같은 모습을 가질 것입니다.


4. 이제 웹 애플리케이션 프로젝트를 빌드하고 F5를 눌러 디버그 모드로 실행하여 테스트해봅니다.


참고

지금까지 작성한 샘플 프로젝트:
RESTXmlMessage.zip

HTTP를 통한 Plain XML 수신


Silverlight 공식 QuickStarts 참고:
http://silverlight.net/QuickStarts/Remote/UsingREST.aspx
신고
Posted by gongdo


티스토리 툴바