[엘리의 실버라이트 2.0] Plain XML 보내기 • 받기 Silverlight2008/09/06 11:19
원본: 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 이벤트를 사용합니다. 그리고 웹 서비스 결과값을 얻기 위해 DownloadStringCompletedEventArgs의 Result 속성을 사용합니다. 결과값을 추가로 처리하거나 단지 사용자에게 결과값을 보여주기만 할 수도 있습니다. 웹 서비스 호출에 에러가 발생했는지 알기 위해서 이벤트 인수의 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가 표시됩니다. (정상적일 경우 ^^~)
참고 사항
이번 시간은 여기까지입니다. 다음 시간에는 Silverlight에서 Syndication Feeds에 액세스하는 것에 대해서 함께 알아보겠습니다. 추석이 다가오네요. 풍성한 추석 보내시고 건강하세요~^^
'Silverlight' 카테고리의 다른 글
| [엘리의 실버라이트 2.0] 관리되는 코드에서 HTML DOM에 액세스 (3) | 2008/09/21 |
|---|---|
| [엘리의 실버라이트 2.0] Syndication Feeds 액세스 (0) | 2008/09/11 |
| [엘리의 실버라이트 2.0] Plain XML 보내기 • 받기 (0) | 2008/09/06 |
| [엘리의 실버라이트 2.0] 스플래시 스크린 만들기 (0) | 2008/08/25 |
| [엘리의 실버라이트 2.0] Silverlight 입력 이벤트 핸들러 작성 (2) (0) | 2008/08/19 |
| [엘리의 실버라이트 2.0] Silverlight 입력 이벤트 핸들러 작성 (1) (2) | 2008/08/12 |
