Silverlight–WebClient I. - stáhnutí souboru

by Lukáš Kubis prosince 19, 2010 04:03

Další článek na silverlight tentokrát se zaměřením na použití třídy WebClient. Ukážeme si jak lze jednoduše stáhnout obsah souboru, webové stránky apod. a zobrazit v naší silverlight aplikaci.

Třída Web.Client se nachází ve jmenném prostoru System.Net v knihovně (System.Net.dll)

WebClient

WebClient nabízí spustu vlastností a metod, ale my si ukážeme pouze ty, které budeme v naší aplikaci využívat:

  • DownloadStringAsync(Uri) : String – provede asynchronní stažení obsahu na zadané Uri adrese
  • DownloadStringCompleted – událost, která se vyvolá, jakmile je stažení ukončené
  • OpenReadAsync(Uri) : Stream – provede asynchronní stažení obsahu na zadané Uri adrese
  • OpenReadCompleted - událost, která se vyvolá, jakmile je stažení ukončené

DownloadStringAsync vrací výsledek jako string, a OpenReadAsync jako Stream. Jelikož se jedná o asynchronní volání, výsledek zjistíme v metodá XYCompleted z vlastnosti Result. Dojde-li při stahování k nějaké výjimce, dočteme se o ní ve vlastnosti Error.

Moje aplikace má pouze jedno tlačítko, textbox pro zadání vstupních údajů a textblock pro zobrazení výsledku. XAML vypadá následovně:

<UserControl xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" 
    x:Class="WebClientDownloadXmlSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">
        <toolkit:BusyIndicator x:Name="ui_busyIndicator">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="40"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Button
                    Grid.Row="0"                       
                    Grid.Column="0"
                    Click="DownloadButtonOnClick" 
                    Content="Stáhnout"
                    Margin="5"/>
                <TextBox 
                    x:Name="ui_txtInput"
                    Grid.Row="0"
                    Grid.Column="1"
                    Margin="5"/>
                <ScrollViewer
                    Grid.Row="1"
                    Grid.Column="0"
                    Grid.ColumnSpan="2"
                    VerticalScrollBarVisibility="Auto"
                    HorizontalScrollBarVisibility="Disabled">
                    <TextBlock 
                        x:Name="ui_txtResult"
                        TextWrapping="Wrap"/>
                </ScrollViewer>
                
            </Grid>
        </toolkit:BusyIndicator>
    </Grid>
</UserControl>

Po stisku tlačítka, vytvoříme na základě hodnoty z textového pole Uri objekt, který potom předáme metodě DownloadStringAsync(). V obsluze události DownloadStringCompleted, ověříme, zda nedošlo ke zrušení stahování, nebo k výjimce a zobrazíme výsledek v textblocku

public partial class MainPage : UserControl
{
    private WebClient _webClient;

    public MainPage()
    {
        InitializeComponent();
    }

    private void DownloadButtonOnClick(object sender, RoutedEventArgs args)
    {
        ui_busyIndicator.IsBusy = true;

        _webClient = new WebClient();
        _webClient.DownloadStringCompleted += DownloadStringCompleted;

        Uri uri = new Uri(ui_txtInput.Text);
        _webClient.DownloadStringAsync(uri);
    }

    void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs args)
    {
        if ( !args.Cancelled && args.Error == null )
        {
            ui_txtResult.Text = args.Result;
        }
        else
        {
            MessageBox.Show(args.Error.ToString());
        }

        ui_busyIndicator.IsBusy = false;
    }
}

Výslednou aplikaci si můžete hned otestovat na adrese http://lukaskubis.net/Demos/Apps/WebClientDownloadXmlSampleTestPage.html

Pokud by jste měli ve své aplikaci problém a dostávali SecurityException, pak si zkontrolujte jestli máte v rootu serveru soubor clientaccesspolicy.xml. Obsah souboru můžete vidět níže:

<?xml version="1.0" encoding="utf-8"?> 
<access-policy>
   <cross-domain-access>
      <policy>
       <allow-from>
          <domain uri="*"/>
         </allow-from>
         <grant-to>
          <resource path="/"
 include-subpaths="true"/>
         </grant-to>
    </policy>
   </cross-domain-access>
</access-policy>

Pokud se chcete dozvědět více o souboru clientaccesspolicy.xml stačí navštívit následující stránku

Materiály ke stažení

Demo ukázku naleznete zde

Tags:

Komentáře

19.12.2010 6:09:45 #

trackback

Silverlight 4 - WebClient a jeho použití

Ukázka jak využít WebClient lukaskubis.net/.../...ient-I-stahnuti-souboru.aspx

Lukask Blog

Přidat komentář


(Zobrazí Vaší Gravatar ikonu)

  Country flag

Click to change captcha
biuquote
  • Komentář
  • Náhled
Loading



Powered by BlogEngine.NET 1.6.0.0
Theme by Mads Kristensen | Modified by Mooglegiant

Microsoft MVP

Microsoft MVP

Školení, konzultace, zakázkový vývoj

Poslední příspěvky