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