'WebClient'에 해당되는 글 1

  1. 2010.07.12 C# WebClient 클래스 사용하여 다운로드,업로드 하기 1

구분선 아래 스크랩한 내용은 silver light 의 예이지만 WebClient 클래스의 활용에 대한 개념은 이해하기가 괜찮은 것 같다.

우선 예를 보자... 자동업데이트 할 때 쓰이는 코드 중에 하나인데.. 사용 중인 코드를 보자..

        private string _szDOWN_PATH = "";
        private string _szLOCAL_FILE_PATH = "";
        private string _szFileName = "";
        public bool WebDownload(string szDOWN_PATH, string szLOCAL_FILE_PATH, string szFileName)
        {
            bool blRtn = false;
            try
            {
                _szDOWN_PATH = szDOWN_PATH;
                _szLOCAL_FILE_PATH = szLOCAL_FILE_PATH;
                _szFileName = szFileName;
                Application.DoEvents();

                webClient = new WebClient();
                Uri ur = new Uri(_szDOWN_PATH);

                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
                
                webClient.DownloadFile(ur, szLOCAL_FILE_PATH);

                blRtn = true;
            }
            catch (Exception e)
            {
                blRtn = false;
                MessageBox.Show(e.GetType() + "\n\r\n\r" + e.Message, "AutoDown");
            }
            return blRtn;
        }

        void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            throw new NotImplementedException();
        }

        void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            FileInfo fi = new FileInfo(_szLOCAL_FILE_PATH);
            if (fi.Length == 0)
            {
                WebDownload(_szDOWN_PATH, _szLOCAL_FILE_PATH, _szFileName);
            }
        }

보다시피 별 내용은 없다.
WebClient 클래스 선언을 하고, DownloadFile 함수를 통해서 다운받는 정도이다.

====================================================================================

WebClient  

WebClient 는 HTTP를 이용해서 외부 리소스나 문자열을 다운로드/업로드 할 때 사용하는 클래스입니다.
HttpWebRequest / HttpWebResponse에 비해 단순한 기능만 제공하므로, 쉽습니다. 

Async : asynchronous communication, 비동기통신 

WebClient에서 제공되는 메서드
DownloadStringAsync / Get / 문자열 타입 / 문자열을 다운로드
UploadStringAsync / Post / 문자열 타입 / 문자열을 업로드
OpenReadAsync / Get / 리소스 타입 / 리소스를 다운로드
OpenWriteAsync / Post / 리소스 타입 / 리소스를 업로드
CancelAsync / 업로드나 다운로드를 취소합니다.  

* 문자열 타입은 일반 Text나 HTML, XML등을 의미하고,   리소스 타입은 이미지나 동영상을 등을 의미합니다.

 WebCliend에서 제공되는 이벤트

DownloadStringCompleted / 문자열 다운로드가 완료 혹은 실패한 경우
DownloadProgressChanged / 문자열 다운로드 양이 변화된 경우
UploadStringCompleted / 문자열 업로드가 완료 혹은 실패한 경우
UploadProgressChanged / 문자열 업로드 양이 변화된 경우

OpenReadCompleted / 리소스를 다운받기 위한 스트림이 열린 경우
OpenWriteCompleted / 리소스를 업로드 하기 위한 스트림이 열린 경우
WriteStreamClosed / 리소스를 업로드 하기 위한 스트림이 닫힌 경우

WebClient 이용해서 문자열 다운로드 하기

MainPage.xaml

01.<Grid x:Name="LayoutRoot" >
02. <Grid.RowDefinitions>
03.  <RowDefinition Height="Auto"/>
04.  <RowDefinition Height="Auto"/>
05.  <RowDefinition Height="Auto"/>
06. </Grid.RowDefinitions>
07. <Grid.ColumnDefinitions>
08.  <ColumnDefinition Width="Auto"/>
09. </Grid.ColumnDefinitions>
10. <TextBlock Text="다운로드 결과"/>
11. <Border Grid.Row="1" BorderBrush="Black" BorderThickness="1">
12.  <TextBlock x:Name="tbResult" Width="400" Height="300" />
13. </Border>
14. <Button x:Name="btRequest" Width="Auto" Height="Auto" Content="다운로드" Grid.Row="2" />
15.</Grid>

 

MainPage.xaml.cs

01.public partial class MainPage : UserControl 
02.{
03. public MainPage()
04. {
05.  InitializeComponent();
06.  btRequest.Click += new RoutedEventHandler(btRequest_Click);
07. }
08. void btRequest_Click(object sender, RoutedEventArgs e)
09. {
10.  WebClient client = new WebClient();
11.  client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
12.  client.DownloadStringAsync(
13.   new Uri("http://antasis9.woweb.net/silverlight/hello.txt", UriKind.Absolute)
14.  );
15. }
16. void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
17. {
18.  tbResult.Text = e.Result.ToString();
19. }
20.}

WebClient 이용해서 리소스 다운로드 하기

MainPage.xaml

01.<Grid x:Name="LayoutRoot">
02. <Grid.RowDefinitions>
03.  <RowDefinition Height="100"/>
04.  <RowDefinition Height="30"/>
05. </Grid.RowDefinitions>
06. <StackPanel Grid.Row="0" 
07.    VerticalAlignment="Center" HorizontalAlignment="Center" 
08.    Orientation="Horizontal">
09.  <TextBlock Text="다운로드양: " FontSize="20" FontWeight="Bold"/>
10.  <TextBlock x:Name="tbDownloadPercent" Text="0" FontSize="20" FontWeight="Bold"/>
11.  <TextBlock Text="%" FontSize="20" FontWeight="Bold"/>
12. </StackPanel>
13. <Button x:Name="btRequest"
14.    Width="100" Height="30" Content="다운로드" Grid.Row="1"/>
15.</Grid>

MainPage.xaml.cs

01.public partial class MainPage : UserControl
02.{
03. public MainPage()
04. {
05.  InitializeComponent();
06.  btRequest.Click += new RoutedEventHandler(btRequest_Click);
07. }
08. void btRequest_Click(object sender, RoutedEventArgs e)
09. {
10.  WebClient client = new WebClient();
11.  // 다운로드 양이 변경되면 호출되는 이벤트의 핸들러
12.  client.DownloadProgressChanged +=
13.   new DownloadProgressChangedEventHandler(DownloadProgressChanged);
14.  // 다운로드 준비가 되면 호출되는 이벤트의 핸들러
15.  client.OpenReadCompleted += 
16.   new OpenReadCompletedEventHandler(OpenReadCompleted);
17.  // 다운로드 시작
18.  client.OpenReadAsync
20.    UriKind.Absolute));
21. }
22. void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
23. {
24.  // 다운로드 양이 변경되면 화면에 출력
25.  tbDownloadPercent.Text = e.ProgressPercentage.ToString();
26. }
27. void OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
28. {
29.  byte[] buffer = new byte[1024];
30.  // 격리된 저장 공간에 파일 생성
31.  IsolatedStorageFile store = 
32.   IsolatedStorageFile.GetUserStoreForApplication();
33.  StreamWriter sw = 
34.   new StreamWriter(store.OpenFile("test.zip", FileMode.Create));
35.  // 네트워크에서 1024 바이트씩 읽어옴
36.  while (e.Result.Read(buffer, 0, 1024) != 0)
37.  {
38.   // 파일에 기록
39.   sw.Write(buffer);
40.  }  
41.  sw.Close();
42. }
43.}

 

* Silverlight는 다른 하위 도메인, 다른 프로토콜, 다른 호스트, 다른 포트에 대해 보안 에러를 발생시킵니다.

오직 같은 도메인, 같은 프로토콜, 같은 포트에 대해서만 접근이 가능합니다.

 

이것을 해결하기 위해서는 외부 서버에서 미리 허가를 받아야 합니다.

접속하고자 하는 서버의 관리자는 실버라이트에서 쓰이는 특정 보안 정책 파일을 해당 도메인에 넣어 줍니다.

그러면 실버라이트 애플리케이션은 미리 약속된 도메인임을 알아채고 보안 문제에 걸리지 않고 서비스를 계속해서 수핼 할  수 있게 됩니다.

 

1) 실버라이트 도메인 정책 파일 (clientaccesspolicy.xml) 

01.<?xml version="1.0" encoding="utf-8" ?>
02.<access-policy>
03. <cross-domain-access>
04.  <policy>
05.   <allow-from http-request-headers="*">
06.    <domain uri="*" />
07.   <allow-from>
08.   <grant-to>
09.    <resource path="/" include-subpaths="true" />
10.   </grant-to>
11.  </policy>
12. </cross-domain-access>
13.</access-policy>

 

2) 플래시 도메인 정책 파일

1.<?xml version="1.0" ?>
2.<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml.dtds/cross-domain-policy.dtd">
3.<cross-domain-policy>
4. <allow-access-from domain="*" headers="*" secure="true" />
5.</cross-domain-policy>

 [출처] http://www.myifu.com/4045

end line =================================================================