달력

092008  이전 다음

  •  
  • 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
  •  
  •  
  •  
  •  

약 한 달 전에 제가 활동하고 있는 학회에서 보현산 천문대를 간다고 공지가 올라왔었습니다.
어린 아이 소풍가는 마음으로 한달 넘게 기다리고 기다리다가 드디어 주말에 갔다 왔습니다.

보현산 천문대는 경북 영천시 화북면 정각리에 있으며, 서울에서 약 4시간 정도 가야 합니다. 보현산 천문대는 소백산 천문대, 대덕전파천문대와 함께 우리나라 3대 천문관측소 중의 하나라고 합니다.


위 사진은 보현산 천문대가 보유하고 있는 국내 최대의 1.8m 반사 망원경입니다.
망원경 뒤로 보시면 아시겠지만 끝없이 이어지는 산줄기가 매우 아릅답습니다. 보현산은 해발 1,124m 정도 되므로 주변이 모두 발 아래에 놓여 보입니다.

도착하고 나서 쌍안경으로 산 아래를 내려다보니 영천 시내와 저 멀리 포항제철, 그리고 바다가 보이더라구요. 높은 곳인 만큼 일몰도 매우 끝내 줍니다.

이 멋진 일몰을 여자친구에게 보여주기 위해 화상통화를 시도했는데 전화가 터지질 않더라구요. 나중에 알았지만 보현산 천문대 주변은 전화가 잘 터지지 않는 것으로 많은 사람들이 이미 알고 있었습니다. 그렇다하더라도 이 곳 역시 사람이 사는 곳!! 그래서 찾아보았죠. 어디가 전화가 잘 되는지 말입니다.


사진 속의 주인공은 백신고등학교에서 지구과학을 담당하시는 김재진 선생님 입니다. 저 분이 서계시는 자리에선 신기하게도 전화가 잘 터지는 것이었습니다. 물론 저기서 고개만 옆으로 돌려도 전화는 다시 먹통이되더군요.
그리고 나중에 다시 확인해보니 밤에는 그나마 꽤 넓은 지역에서 전화가 잘되었습니다. 그래도 안되는 곳은 낮보다는 많이 없었습니다.

보현산 정상임을 알리는 표지석 앞에서 사진을 한 컷 찍었습니다. 사진 뒤로 보이는 작은 마을이 참 정겹게 느껴집니다. 보현산 천문대는 자동차로 올라가기에도 참으로 꼬불꼬불하고 가파른 곳입니다. 옛날에는 교통수단도 만만치 않았을텐데 이웃 마을 갈려면 얼마나 많은 산을 넘어야 했을까요. 가는 길 중간에 호랑이나 도적들도 만났을텐데 말입니다.^^;

(보현산 정상임을 알리는 표지석 앞에서의 세티)

정확한 이름이 기억나지는 않지만 보현산 천문대가 보유하고 있는 1.8m 망원경에 들어가는 받침대(?) 라고 합니다. 실제 크기라고 하더라구요. 그래서 기념으로 한번 찍어봤습니다.^^


보현산 천문대가 보유하고 있는 1.8m 반사망원경의 스펙은 다음의 주소에서 확인할 수 있습니다.
http://boao.kasi.re.kr/facility/doyak.aspx

천문대 주변을 이리저리 서성이다가 사람들과 함께 태양플레어망원경 건물동으로 이동했습니다. 이 망원경은 주로 태양의 자기활동을 측정하는데 사용되는 망원경이라고 합니다. 마침 우리가 도착했을 때 망원경이 건물 밖으로 그 모습을 드러내고 있었습니다.

처음에 봤을 때는 거대한 LPG 가스통이 연상되었습니다.^^; 옆에 있던 한 어린이는 이것을 보고 잠수함의 어뢰같다고 하더라구요.^^ LPG 가스통 보다는 더 나은 표현 같았습니다.
태양플레어 망원경에 대한 설명은 다음의 링크에 상세하게 설명되어 있습니다.(http://boao.kasi.re.kr/facility/solartel.aspx)

학회에서 워낙 많은 분들이 오셨던터라 제가 속한 지부는 좀 늦은 시간에 망원경을 구경할 수 있었습니다. 1.8m 반사 망원경이 전 세계적으로는 50위권 밖에서 맴도는 망원경이라고 합니다. 그것으로 본 목성은 그리 아름답지는 않았지만 그래도 우리나라에서는 손꼽힐 정도로 좋은 장비이기에 마음껏 구경했습니다.
(한국의 과학기술에 대한 투자가 너무 열악한 것 같습니다.)


그런데 이 망원경.... 어디서 많이 본 것 같지 않으세요? ㅎㅎ
네~ 그렇습니다. 우리가 사용하는 만원권 지폐 뒷면에 들어가 있는 망원경의 사진입니다.
보현산 천문대의 망원경이 전세계에서 50위권 정도 밖에 안되는 망원경이긴 하지만 그래도 우리나라의 자랑스러운 망원경 중의 하나임에는 틀림없습니다. 이런 장비로 우리의 과학자들은 세계에 내놓아도 손꼽히지 않는 결과물들을 만들어 내고 있습니다. 그 분들에게 더욱 넉넉한 투자가 이루어진다면 지금보다 더 멋진 결과로 세계를 상대로 경쟁하게 되지 않을까 생각해 봅니다.

보현산 천문대에서 하루를 보내며 많은 별들을 보고 싶었지만 온통 하늘을 덮어버린 구름 때문에 결국 유령놀이하고 잠들었습니다.

아무나 갈 수 없는 곳에서 보낸 하룻밤은 매우 특별했습니다. 그리고 우리나라 천문과학기술에 대한 지원이 어느정도인지도 확인해볼 수 있는 시간이었습니다.

요즘 제가 즐겨보는 주말사극 '대왕세종'을 보면 TV 광고에 늘 이렇게 나옵니다. '우리나라 최고의 시대였던 세종 시대' 라는 멘트가 나옵니다. 세종이 과학기술과 문화에 매우 관심이 많았다는 사실은 누구나 알고 있으며, 그가 이룬 과학적 성과가 매우 대단하다는 것도 많은 후손이 알고 있습니다.

도로를 넓히고, 건물을 짓고, 필요한 전자제품을 만들고 하는 것도 좋지만 그런 것들의 수명이 백년 이하라고 할 때 과학기술에 대한 투자로 얻어진 그 지식은 수백년을 이어진다는 생각이 듭니다.

수백년을 이어가는 지식... 그리고 그것에 대한 투자가 진정 대한민국을 위한 투자가 아닐까 하는 생각을 해봅니다. 



참고 사이트
1. 보현산 천문대(http://boao.kasi.re.kr/intro/facilities.aspx)
2. 산으로 가는 사람들(http://alcalde.tistory.com/233?srchid=BR1http%3A%2F%2Falcalde.tistory.com%2F233)
3. 한국아마추어천문학회 서울경기 지부 (http://www.seoulkaas.net)

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by -세티-

원본http://silverlight.net/Quickstarts/Remote/323aac2f-14cc-4dd8-bb40-fa2cb3c2e522.aspx

본 강좌는 위의 원글을 참고 및 번역해서 작성했으며글 중간중간 제 개인적인 표현이나 의견을 넣어서 각색했습니다.

 

이번 시간에는 서버와의 통신 없이 관리되는 코드 (.cs 파일)을 이용해서 HTML Document Object Model (DOM)에 동적으로 액세스할 수 있는 방법을 설명합니다.

 

사전 준비 사항

- Silverlight 2 베타 2

- Visual Studio 2008 (90일 평가판)

- Visual Studio 2008용 Silverlight Tools 베타 2

 

Test 페이지에 HTML 엘리먼트 추가하기

먼저, 생성할 테스트 페이지에 버튼 및 텍스트 박스, 등의 HTML 엘리먼트를 추가할 것입니다.

 

1. Visual C# Silverlight 응용 프로그램 프로젝트 하나를 만듭니다. 솔루션에 컨트롤을 호스팅할 새 웹 추가 옵션이 선택되어진 것을 확인합니다. 저는 프로젝트 이름을 EloiHtmlDom으로 설정하였습니다. (참고: Silverlight 응용 프로그램 만들기)

 

2. 시작 페이지를 HTML 테스트 페이지로 설정하고 소스뷰를 엽니다.

시작 페이지 설정은 EloiHtmlDomWeb의 마우스 우측 클릭하여 속성 페이지 시작 옵션에서 변경 가능하며 간단히 HTML 테스트 파일에 마우스 우측 클릭하여 시작 페이지로 설정으로도 변경 가능합니다.

                                                          속성 페이지에서 설정하는 화면


                                                           시작 페이지로 설정을 이용한 설정

3. <object> 태그를 찾아 height 속성을 “100%”에서 “10%”로 변경합니다.

 

4. </iframe> 태그 뒤에 다음 HTML 코드를 추가합니다. 이 코드에는 두 개의 버튼과 텍스트 박스 세 개를 포함하고 있습니다.

 

<div id=”basic1”>

   <h3> Silverlight 관리되는 코드로 HTML 버튼 다루기</h3>

   <hr />

   <strong>첫 번째 텍스트 박스의 텍스트를 두 번째 텍스트 박스에 대문자로 변경</strong><br />

   <label>여기에 텍스트를 입력하세요:</label>&nbsp;

   <input type=”text” id=”txtInput” disabled=”disabled” size=”35” />&nbsp;

   <button type=”button” id=”btnUCtxt”>대문자 처리</button>

   <br /><br />

   <label>처리 결과:</label>

   <input type=”text” id=”txtOutput” size=”60” />

</div>

<br /><br />

<div id=”basic2”>

   <button type=”button” id=”btnGetProperties”>속성 가져오기</button><br />

   <input type=”text” id=”txtOutputProperties” size=”60” />

</div>

 

5. 응용 프로그램을 실행 시키면(ctrl + F5 키를 이용하여 디버깅을 사용하지 않고 실행 시킵니다.) 대문자 처리 버튼과 속성 가져오기 버튼, 텍스트 박스 3개를 볼 수 있습니다. 먼저 첫 번째 텍스트 박스 에 대해서 다루려고 합니다. 현재 value는 없고 disabled 상태입니다. 

관리되는 클래스에서 HTML 페이지 연결하기

관리되는 클래스에서 HTML 페이지에 연결하기 위해 먼저 Page 생성자에서 참조를 초기화 합니다.

 

1. 코드 비하인드 파일을 (Page.xaml.cs) 열어 Page 클래스를 찾습니다.


2. using
키워드를 사용하여 System.Windows.Browser 네임스페이스를 추가합니다.


3. HtmlDocument
타입의 클래스 레벨 _doc 변수를 선언합니다.


4. Page
생성자의 _doc 변수를 초기화합니다.

 

현재 HTML 페이지의 인스턴스로 _doc 변수를 사용합니다.

 

namespace EloiHtmlDom

{

    Public partial class Page : UserControl

    {

        private HtmlDocument _doc;

        public Page()

        {

            InitializeComponent();

            _doc = HtmlPage.Document;

HTML DOM 속성에 액세스하기

다음은 첫 번 째 txtInput 텍스트 박스의 속성을 동적으로 속성을 변경해보도록 하겠습니다.

 

1. Page 생성자의 끝 부분에 다음 코드를 추가합니다.

 

HTML document objectGetElementById 메서드를 사용해서 disabled 상태를 변경하고 새로운 값을 설정합니다.

CS

// Return for all pages except those ending in TestPage.html

if (_doc.DocumentUri.AbsoluteUri.EndsWith(“TestPage.html”) != true)

    return;

 

_doc.GetElementById(“txtInput”).SetProperty(“disabled”, false);

_doc.GetElementById(“txtInput”).SetAttribute(“value”, “This is set from managed code.”);

 

2. 응용 프로그램을 실행 시킵니다.

txtInput 텍스트 박스에는 “This text is set from managed code.”가 나타날 것입니다. 그리고 입력 가능하게 되었습니다.

HTML DOM 엘리먼트의 이벤트 처리

HTML DOM 엘리먼트의 이벤트를 처리할 이벤트 핸들러를 추가합니다.

 

1. Page 생성자의 끝 부분에 아래 코드를 추가하여 대문자 처리 버튼의 onclick 이벤트의 이벤트 핸들러를 추가합니다.

 

  btnUCtxt 엘리먼트에 참조를 btnUC 인스턴스 변수에 대입하고 btnUC 변수를 사용하여 버튼의 onclick 이벤트에 이벤트 핸들러를 추가합니다.

 

CS

// Add event handler for Uppercase Text button.

HtmlElement btnUC = _doc.GetElementById(“btnUCtxt”);

btnUC.AttachEvent(“onclick” new EventHandler<HtmlEventArgs>(this.OnUCtextClicked));

 

2. 대문자 처리 버튼의 onclick 이벤트의 OnUCtextClicked라는 이벤트 핸들러를 작성합니다.

3. 이벤트 핸들러에서 HTML 엘리먼트의 속성을 읽거나 씁니다.

예를 들어, 다음의 OnUCtextClicked 이벤트 핸들러에서 SetAttributeGetAttribute 메서드는 속성 값을 쓰고 읽기위해 txtInputtxtOutput 엘리먼트에서 사용됩니다. txtInput 엘리먼트에 입력된 텍스는 대문자로 변환되고 txtOutput 엘리먼트의 value 속성에 할당됩니다.

 

CS

void OnUCtextClicked(object sender, HtmlEventArgs e)

{

    HtmlElement input = _doc.GetElementById(“txtInput”);

    HtmlElement output = _doc.GetElementById(“txtOutput”);

    output.SetAttribute(“value”, input.GetAttribute(“value”).ToUpper());

}

 

4. 응용 프로그램을 실행하고 대문자 처리 버튼을 클릭합니다.

HTML DOM에서 메서드 호출하기

마지막으로 HTML DOM에서 메서드를 호출합니다.

 

1. Page 생성자의 끝 부분에 아래 코드를 추가하여 속성 가져오기 버튼의 onclick 이벤트의 이벤트 핸들러를 추가합니다.

 

첫 번째 버튼과 마찬가지로 btnGetProperites 엘리먼트 참조를 btnPropGet 인스턴스 변수에 대입하고 속성 가져오기 버튼의 onclick 이벤트의 이벤트 핸들러를 추가합니다.

 

CS

// Add event handler for Get Properties button.

HtmlElement btnPropGet = _doc.GetElementById(“btnGetProperties”);

btnPropGet.AttachEvent(“onclick”, new EventHandler<HtmlEventArgs>(this.OnGetPropClicked));

 

2. 속성 가져오기 버튼의 OnGetPropClicked라는 onclick 이벤트 핸들러를 작성합니다.

3. 이벤트 핸들러에서 호출하려는 메서드의 HTML 엘리먼트에 동적 참조를 얻고 메서드를 호출합니다.

.

예를들어, 다음 OnGetPropClicked 이벤트 핸들러는 현재 페이지의 포트번호와 쿠키 상태, URI (Uniform Resource Identifier)를 나타낼 HtmlPage 개체를 사용하는 방법을 보여줍니다.

 

CS

void OnGetPropClicked(object sender, HtmlEventArgs e)

{

    string outputText = “”;

    // _doc 선언한 밑에 아래 주석과 같이 _count 변수를 초기화합니다.

    // private int _count = 0;

_count++;

 

    switch (_count % 3)

    {

        case 0:

            outputText = “DocumentUri.AbsolutePath: “ + HtmlPage.Document.DocumentUri.AbsolutePath;

            break;

 

        case 1:

            outputText = “Cookies Enabled: “ + HtmlPage.BrowserInformation.CookiesEnabled.ToString()

            break;

 

        case 2:

            outputText = “Port: “ + HtmlPage.Document.DocumentUri.Port.ToString();

            break;

}

_doc.GetElementById(“txtOutputProperties”).SetAttribute(“value”, outputText);

}

 

4. 응용 프로그램을 실행하고 속성 가져오기 버튼을 여러 번 클릭합니다.

버튼을 클릭할 때마다 txtOutputProperties 엘리먼트는 페이지의 URI와 쿠키 사용 가능 여부, URI를 위한 포트 번호 중 하나를 나타납니다.

지금까지 관리되는 코드에서 (.cs 파일) HTML DOM에 액세스하는 것에 대해서 알아보았습니다.
행복한 하루 보내세요
~^.^


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by -세티-

원본: http://silverlight.net/Quickstarts/Remote/ed86e719-0da0-49e1-a9e1-b31f483070d4.aspx

본 강좌는 위의 원글을 참고 및 번역해서 작성했으며, 글 중간중간 제 개인적인 표현이나 의견을 넣어서 각색했습니다.

안녕하세요. 엘리입니다.

이번 시간은 RSS 2.0 또는 Atom 1.0과 같은 Syndication 서비스에 액세스할 수 있는 Silverlight 클라이언트를 만들어 보도록 하겠습니다.

 

사전 준비 사항

- Silverlight 2 베타 2

- Visual Studio 2008 (90일 평가판)

- Visual Studio 2008용 Silverlight Tools 베타 2

- Silverlight SDK 2.0 베타 2

 

Silverlight 웹 서비스 지원에 대해서 좀 더 자세한 정보는 Silverlight 서비스 예제를 참고하시기 바랍니다.

 

먼저 Silverlight 클라이언트 응용 프로그램을 만들어 보도록 하겠습니다.

 

1. Visual Studio 2008을 열어 파일 새 프로젝트를 선택합니다. 프로젝트 형식을 Silverlight로 선택하고 Silverlight 응용 프로그램 템플릿을 선택합니다.

 

2. 프로젝트 이름을 원하는 것으로 입력하시고 확인을 클릭합니다. 저 같은 경우는 EloiSyndication으로 하였습니다.

 

3. Silvierlight 응용 프로그램 추가 창에서 이 프로젝트 안에 Silverlight를 호스팅할 HTML 테스트 페이지를 동적으로 생성을 선택하고 확인을 클릭합니다.

 

Silverlight 응용 프로그램에서 Syndication 관련 작업을 위해 System.ServiceModel.Syndication.dll을 참조에 추가합니다.

 

1. 솔루션 탐색기에서 참조를 마우스 우측 클릭을 하여 참조 추가를 선택합니다.

사용자 삽입 이미지
2.
참조 추가 창의 .NET 탭에서 System.ServiceModel.Syndication을 선택하고 확인을 클릭합니다.
사용자 삽입 이미지
3.
아래 코드를 Page.xaml.cs 파일에 추가합니다.

 

using System.ServiceModel.Syndication;

using System.Xml;

 

다음은 syndication feed 요청을 위한 HTTP request를 만듭니다.

 

1. 먼저 이 컨트롤에서 액세스하기 원하는 syndification feed 하나를 찾아 그 주소를 메모해둡니다. 이 예제에서는 http://www.setisigns.net/rss를 사용하겠습니다. 크로스 도메인을 가능하기 위해 feed를 호스팅하는 도메인의 루트에 Clientaccesspolicy.xml이나 Crossdomain.xml 파일을 위치 시켜야합니다.

(: http://www.setisigns.net/Clientaccesspolicy.xml, http://www.setisigns.net/Crossdomain.xml)

 

Clientaccesspolicy.xml

<?xml version=”1.0” encoding=”utf-8”?>

<access-policy>

    <cross-domain-access>

        <policy>

    <allow-from http-request-headers=”*”>

        <domain uri=”*”/>

    </allow-from>

    <grant-to>

        <resource path=”/” include-subpaths=”true”/>

    </grant-to>

</policy>

</cross-domain-access>

</access-policy>

 

Crossdomain.xml

<?xml version=”1.0”?>

<!DOCTYPE cross-domain-policy SYSTEM

 “http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd”>

<cross-domain-policy>

    <allow-http-request-headers-from domain=”* “ headers=”*” />

</cross-domain-policy>

 

 

2. Page.xaml.cs 파일을 열어 Page() 메서드 안에 받고자 하는 syndication feed uri를 설정하여 HTTP request를 만듭니다. 좀 전에 메모해둔 feed 주소를 사용합니다.

 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(“http://www.setisigns.net/rss”));

 

3. 비동기 HTTP request를 만들고 콜백을 등록합니다.

 

request.BeginGetRespone(new AsyncCallback(responseHandler), request);

 

4. 위 코드를 포함한 Page 메서드는 아래와 같습니다.

 

public Page()

{

    // Required to initialize variables

    InitializeComponent();

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(“http://www.setisigns.net/rss”));

    request.BeginGetResponse(new AsyncCallback(responseHandler), request);

}

 

다음은 스트림에 대한 XMLReader를 받고 SyndicationFeed 클래스 인스턴스를 만듭니다.

 

1. responseHandler 콜백 함수에서 HTTP response를 받습니다.

 

void responseHandler(IAsyncResult asyncResult)

{

    HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;

    HttpWebResponse respone = (HttpWebResponse)request.EndGetResponse(asyncResult);

}

 

2. responseHandler에 스트림을 받는 XML 리더를 만들고 SyndicationFeed 클래스 안에 그 리더를 로드합니다.

 

XmlReader reader = XmlReader.Create(response.GetResponseStream());

SyndicationFeed feed = SyndicationFeed.Load(reader);

 

이제 SyndicationFeed를 사용하여 실제 syndication feed의 출력 부분의 코드를 작성합니다.

 

1. Page.xaml 파일을 열어 Grid안에 TextBlock을 추가합니다.

 

<TextBlock x:Name=”feedContent” />

 

 

2. SyndicationFeed 개체가 생성되고 각 SyndicationItem 개체에 액세스하는 Items 컬렉션으로 루프를 돌립니다. 이 예제는 제목과 TextBox 컨트롤에 각 항목의 날짜를 추가합니다.

 

foreach (SyndicationItem item in feed.Items)

{

    feedContent.Text += “* “ + item.Title.Text + Enviroment.NewLine;

    feedContent.Text == “ Published on: “ + item.PublishDate + Enviroment.NewLine;

}

 

3. 비동기 요청 콜백 함수는 아래와 같습니다.

 

void responseHandler(IAsyncResult asyncResult)

{

    HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;

    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

 

    XmlReader reader = XmlReader.Create(response.GetResponseStream());

    SyndicationFeed feed = SyndicationFeed.Load(reader);

 

    Foreach (SyndicationItem item in feed.Items)

    {

        feedContent.Text += “* “ + item.Title.Text + Enviroment.NewLine;

        feedContent.Text += “  Published on: “ + item.PublishDate + Enviroment.NewLine;

}

}

 

4. 이제 Ctrl + F5를 눌러 브라우저에서 feed 리스트를 확인하시기 바랍니다.

 

즐거운 추석 연휴 보내시고 맛있는 것도 많이 드세요. ^^ 고향에 내려가시는 분들은 오고 가시는 길 많이 힘드시겠지만 가족들과의 만남이 더 뜻 깊을 거라 믿습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by -세티-

원본: http://silverlight.net/Quickstarts/Remote/UsingREST.aspx

본 강좌는 위의 원글을 참고 및 번역해서 작성했으며, 글 중간중간 제 개인적인 표현이나 의견을 넣어서 각색했습니다.

 

안녕하세요. 엘리 입니다.

이번 시간에는 HTTP 전송을 사용하여 Plain XML 메시지 (Plain Old XML 또는 POX 메시지라고도 부릅니다.)를 받는 방법에 대해서 알아보도록 하겠습니다.

 

POX 메시지는 SOAP으로 포장되지 않은 순수 XML 데이터로 이루어져 있고 SOAP 기반의 프로토콜을 지원하지 않는 여러 종류의 클라이언트 (: 웹 브라우저)에서 주고 받게 됩니다. SOAP과 WS-* 외에 HTTP를 사용하여 통신할 때 POX는 데이터를 전달받는 좋은 방법입니다.

 

그럼 바로 예제를 보도록 하겠습니다. 아래 예제는 WebClient 클래스를 사용하여 웹 서비스에 액세스합니다. 웹 서비스와 Silverlight 기반 응용 프로그램이 같은 도메인상에서 호스팅되면 웹 서비스와 Silverlight 기반 응용 프로그램을 원활히 사용할 수 있습니다. 웹 서비스와 통신하는 Silverlight 기반 응용 프로그램을 만들 때 Silverlight 컨트롤은 웹 서버로부터 서비스되는 웹 페이지 내에서 호스팅 되어야 합니다. 파일 시스템 (: HTML 테스트 페이지)에서 웹 서비스와 통신을 하게 되면 보안 예외가 발생할 것입니다.

 

참고

현재 WebClient 클래스는 크로스 도메인을 지원하지 않습니다. 현재 릴리스된 WebClient는 같은 서버에서 웹 서비스와 Silverlight 기반의 응용 프로그램이 호스팅되어야 합니다. 웹 서비스와 Silverlight 기반 응용 프로그램이 다른 도메인에서 호스팅되고 있으면 웹 서비스에 크로스 도메인이 가능하게 XML Policy 파일이 있어야 합니다. 좀 더 자세한 정보는 MSDN에서 How to: Make a Service Available Across Domain Boundaries를 참고하시기 바랍니다.

 







다음은 XML로 결과가 리턴되는 웹 서비스에 액세스하는 방법에 대해서 소개합니다.

 

1. Silverlight 프로젝트 하나를 만듭니다. Silverlight 응용 프로그램 추가 창에서 솔루션에 컨트롤을 호스팅할  새 웹 추가를 선택합니다. 이 프로젝트 안에 Silverlight를 호스팅할 HTML 테스트 페이지를 동적으로 생성 옵션을 선택하면 보안 관련 예외 발생이 일어납니다. (참고: Silverlight 응용 프로그램 만들기)

 

2. Silverlight 프로젝트에서 System.Net 어셈블리에 참조를 가지고 있는 확인합니다.


사용자 삽입 이미지

그리고 웹 서비스를 호출하기 위해 System.Net의 클래스들이 필요하므로 Page.xaml.cs 파일에서 System.Net 네임스페이스가 추가되었는지 확인합니다.

사용자 삽입 이미지

3. 웹 서비스를 호출하기 위해 WebClient를 만들고 DownloadStringAsync(Uri) 메서드를 호출합니다. 호출하기 원하는 웹 서비스에 파라미터로 URI를 전달합니다.

 

4. 웹 서비스 호출의 결과값을 알기 위해, 웹 클라이언트에 DownloadStringCompleted 이벤트를 사용합니다. 그리고 웹 서비스 결과값을 얻기 위해 DownloadStringCompletedEventArgsResult 속성을 사용합니다. 결과값을 추가로 처리하거나 단지 사용자에게 결과값을 보여주기만 할 수도 있습니다. 웹 서비스 호출에 에러가 발생했는지 알기 위해서 이벤트 인수의 Error 속성을 사용합니다.

 

다음 예제는 Digg 웹 서비스에 요청을 보내는 방법과 XML로 응답을 돌려받는 방법에 대해서 보여줄 것입니다. 텍스트 박스에 숫자를 입력하고 버튼을 클릭하면 응답으로 XML을 볼 수 있습니다. Digg 웹 서비스가 다른 도메인에 있더라도 Digg 웹 서비스가 크로스 도메인을 호출을 지원하기 때문에 이 요청은 작동할 것입니다.

 

page.xaml 파일을 열어 아래 코드를 입력합니다.

 

CS

<UserControl x:Class="EloiShowPox.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    FontFamily="맑은 고딕" FontSize="11"

    Width="500" Height="600">

    <!—UserControl border 설정합니다.-->

<Border BorderBrush="Black" BorderThickness="2" >

        <StackPanel Orientation="Vertical">

            <TextBlock  Margin="5" Text="POX 예제" />

            <!—StackPanel TextBlock TextBox 엘리먼트를 수평으로 지정하기 위해 Orientation 속성을 Horizontal 설정합니다.-->

<StackPanel Orientation="Horizontal" Margin="5">

                <TextBlock VerticalAlignment="Center"

                   Text="텍스트 박스에 숫자를 입력하세요: (1-4) " />

                <TextBox x:Name="numTextBox" Width="20" />

            </StackPanel>

            <!—Button_Click 이벤트 핸들러를 설정합니다.-->

<Button Width="160" HorizontalAlignment="Left" Margin="5"

              Content=" 서비스에서 응답 받기"

                Click="Button_Click" />

            <!—POX TextBlock 자리입니다.-->

            <TextBlock x:Name="resultBlock" Grid.Row="3" TextWrapping="Wrap" />

        </StackPanel>

    </Border>

</UserControl>

 

다음으로는 page.xaml.cs 파일을 열어 아래 코드를 작성합니다.

 

CS

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Net;

 

namespace EloiShowPox

{

    public partial class Page : UserControl

    {

        WebClient client = new WebClient();

 

        public Page()

        {

            InitializeComponent();

            // 이벤트와 핸들러를 지정합니다.

client.DownloadStringCompleted +=

new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);

        }

 

        private void Button_Click(object sender, RoutedEventArgs e)

        {

            // numTextBox 입력한 숫자만큼의 이미지 관련 POX 가져옵니다.

string url1 = "http://services.digg.com/galleryphotos?count=" +

                numTextBox.Text +

                "&appkey=http%3A%2F%2Fwww.silverlight.net";

            // DownloadStringAsync(Uri) 메서드를 사용하여 문자열로 요청

            client.DownloadStringAsync(new Uri(url1));

        }

        // DownloadStringCompleted 이벤트 핸들러

void client_DownloadStringCompleted(object sender,

            DownloadStringCompletedEventArgs e)

        {

            // DownloadStringCompletedEventArgs Result 속성을 사용하여 TextBlock 해당 내요을 표시합니다.(POX 메시지나 에러 메시지가 출력되겠지요? ^^)

if (e.Error == null)

            {

                resultBlock.Text = e.Result;

            }

 

            else

                resultBlock.Text = e.Error.Message;

        }

    }

}

 

응용 프로그램을 실행시키면 page.xaml에 작성한 resultBlock 이름으로 지정한 TextBlock Digg 웹서비스에서 받은 POX가 표시됩니다. (정상적일 경우 ^^~)


사용자 삽입 이미지
 

참고 사항


WebClient
클래스


이번 시간은 여기까지입니다. 다음 시간에는 Silverlight에서 Syndication Feeds에 액세스하는 것에 대해서 함께 알아보겠습니다. 추석이 다가오네요. 풍성한 추석 보내시고 건강하세요~^^

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by -세티-