.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(12):数据与通信之WebClient

上一篇 / 下一篇  2008-04-11 19:39:05

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文将介绍如何在Silverlight 2中使用Web Client进行通信。

简单示例

编写一个简单的示例,在该示例中,选择一本书籍之后,我们通过Web Client去查询书籍的价格,并显示出来,最终的效果如下:
(I"a'HRhd3U{0
*d*qX{6[J|o3LZO0

编写界面布局,XAML如下:

<GridBackground="#46461F">ITPUB个人空间8UhdsH_,n
<
Grid.RowDefinitions>
^7F7V/B fs,s0<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间4X C5PBjb:P QI{
<
RowDefinitionHeight="*"></RowDefinition>
e:GK}\0<
RowDefinitionHeight="40"></RowDefinition>
'V:i"PL d ? X0</
Grid.RowDefinitions>ITPUB个人空间 lK:yO`'_
<
Grid.ColumnDefinitions>
,~ B:t P!r;} ]E]0<
ColumnDefinition></ColumnDefinition>ITPUB个人空间2Jk,jm^hh
</
Grid.ColumnDefinitions>ITPUB个人空间.o:eN#kE
<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"ITPUB个人空间+d*U Cp{h
Width="240"Height="36"
5F4mVzF[\bTc0
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间:^Ew C.\;H
<
TextBlockText="书籍列表"Foreground="White"ITPUB个人空间+r-@d9~/INu|
HorizontalAlignment="Left"VerticalAlignment="Center"
-[ }/hEHY!L&[J0
Margin="20 0 0 0"></TextBlock>ITPUB个人空间a#P&N%d'B }q;x
</
Border>
"x u A]3aDb0<
ListBoxx:Name="Books"Grid.Row="1"Margin="40 10 10 10"
.l-\_l$o F0
SelectionChanged="Books_SelectionChanged">
)T4t(J m7S#ws^0<
ListBox.ItemTemplate>
~;hUukpybj$`1f0E0<
DataTemplate>
.Z3n r8m%Cu1I0<
StackPanel>ITPUB个人空间)h wc4e9}3s ?6c H
<
TextBlockText="{BindingName}"Height="32"></TextBlock>
M KSzu#G}0</
StackPanel>
,b:|mRWHe0</
DataTemplate>
%GRC8qum5F)t Sk#}0</
ListBox.ItemTemplate>ITPUB个人空间7w"vh"J@qG5G
</
ListBox>ITPUB个人空间dKK ["Y'x0c3o
<
BorderGrid.Row="2"Grid.Column="0"CornerRadius="15"
a2up!o"P x \ Q0
Width="240"Height="36"Background="Orange"
"mA.Tb0{0
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间\~op#_@;p?
<
TextBlockx:Name="lblPrice"Text="价格:"Foreground="White"
(on!Ui S w;k ck:j0R0
HorizontalAlignment="Left"VerticalAlignment="Center"
5\{ i2KG&zG-JM0
Margin="20 0 0 0"></TextBlock>
.BM8z1Np pi2c0</
Border>
\c0~YyL(l0</
Grid>

为了模拟查询价格,我们编写一个HttpHandler,接收书籍的No,并返回价格:

public classBookHandler:IHttpHandlerITPUB个人空间*L
Z-c;mR8m?f
{
7wSnZaQ0public static readonly string[] PriceList =new string[] {ITPUB个人空间 |sTuE)Aa
"66.00",ITPUB个人空间0pvmjI6T
"78.30",
IRRb?)s%Swb'j0"56.50",ITPUB个人空间}M4o8n\$E
"28.80",ITPUB个人空间i(U Z JS!T
"77.00"ITPUB个人空间Q2\i*fn ? u8{ T
};ITPUB个人空间L:a Yxy5{$[
public voidProcessRequest(HttpContextcontext)ITPUB个人空间.ZL:X*Ii)I
{ITPUB个人空间(d'kC ]+Aj$y
context.Response.ContentType ="text/plain";
+f5]1u%Ms?@0context.Response.Write(PriceList[Int32.Parse(context.Request.QueryString["No"])]);ITPUB个人空间&fy.}@1l`}
}ITPUB个人空间w{9I6wM

6X#Jd5wc5r,mE0public boolIsReusableITPUB个人空间wc(Y%Q6t$w3]
{
DU!SPd9?0getITPUB个人空间.]/_vq*qZ*~^
{ITPUB个人空间Fu[+M,zk$T
return false;
6r-K%k kz:tcuNR0}ITPUB个人空间!Z{,xD:t9CW4YN|
}ITPUB个人空间V+P/z,R^L4f
}

在界面加载时绑定书籍列表,关于数据绑定可以参考一步一步学Silverlight 2系列(11):数据绑定

voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间
kPC6Lf9l{0?p4nV'R
{
:i5t$e s'O(L0List<Book> books =newList<Book>() {ITPUB个人空间L C7` m2SOd4qFaD
newBook("Professional ASP.NET 3.5"),ITPUB个人空间1nkZg-Nw+Umx
newBook("ASP.NET AJAX In Action"),ITPUB个人空间 x2z)A%O"w
newBook("Silverlight In Action"),
&Z9b,_;o.O'Rt-B0newBook("ASP.NET 3.5 Unleashed"),
'u"l @M.r,Z1LV0newBook("Introducing Microsoft ASP.NET AJAX")
&fX1FJ+s0};
/_U.E7y^b0
2CM&y+Js/k(Nyd0J0Books.ItemsSource = books;ITPUB个人空间E Ko@ yX ]

rH5B&_q)U0}

接下来当用户选择一本书籍时,需要通过Web Client去获取书籍的价格,在Silverlight 2中,所有的网络通信API都设计为了异步模式。在声明一个Web Client实例后,我们需要为它注册DownloadStringCompleted事件处理方法,在下载完成后将会被回调,然后再调用 DownloadStringAsync方法开始下载。

voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)
v|pJS i0{
a#`&P&H.gj p8Pj0Uriendpoint =newUri(String.Format("http://localhost:49955/BookHandler.ashx?No={0}",Books.SelectedIndex));ITPUB个人空间$U#I _!t,sA9f0mJ;E:L

CH)k8Y l,t[0WebClientclient =newWebClient();
lOCG\G-hjS+C x0client.DownloadStringCompleted +=newDownloadStringCompletedEventHandler(client_DownloadStringCompleted);ITPUB个人空间 N'n(yLQ:KX

V&D3~7s@#BJ0client.DownloadStringAsync(endpoint);ITPUB个人空间V,E,L7Q4wb-r
}ITPUB个人空间4?d-n`a:ARh&b

"@5q*nPg6o;Z h+^7F?0voidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)ITPUB个人空间-bY2F[dI
{ITPUB个人空间6b8F"d-au)@6o
if(e.Error ==null)
V#](V!\ nv0{
$^ M{X$o9U!m Q5{X0lblPrice.Text ="价格:"+ e.Result;ITPUB个人空间BAb e$bzi;js g
}ITPUB个人空间 lFZ+jYt
else
-s-K'\TD z7mu0
{ITPUB个人空间VUX+\/up%| N
lblPrice.Text = e.Error.Message;ITPUB个人空间 Sga{I-Xd
}ITPUB个人空间V2yY)m+c$|ITU"p
}

注意大家可以在Web Application Project的属性页中,把ASP.NET Development Server的端口号设置为一个固定的端口号:


_5aqF&G"DM0

最后完整的代码如下:

public partial classPage:UserControlITPUB个人空间3b:yOn&h,M7x_$?
{ITPUB个人空间GS:y{ULm r_A
publicPage()ITPUB个人空间}?"P|PI
{ITPUB个人空间0W@/IZI-wK o
InitializeComponent();
Lv }-U_\ ql0}
r5fcxW { P5V.Wq!R0
,V@+n3uc _eL0voidUserControl_Loaded(objectsender,RoutedEventArgse)
{ P&N Z WZZ z0{ITPUB个人空间`6|#X#M7I"V+o
List<Book> books =newList<Book>() {ITPUB个人空间mM,_ FD%mg*V
newBook("Professional ASP.NET 3.5"),
9] I qM6yTLXb0newBook("ASP.NET AJAX In Action"),
^ f-Lx5D njob0newBook("Silverlight In Action"),
p9Z/}5CF#bjw+M/[0newBook("ASP.NET 3.5 Unleashed"),ITPUB个人空间IC i1Y6go$]
newBook("Introducing Microsoft ASP.NET AJAX")
s:q'A1Z0]:t3h0};ITPUB个人空间BcVt.QyG

xnu7h\0Books.ItemsSource = books;
k6i-B2c'{,q%d/Y0ITPUB个人空间2]B-w:z}$O
}ITPUB个人空间`xY$g |l

4Q/M@#HH,p-k0voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)
3^hH)Zv;Q5LX@0{ITPUB个人空间9@ CZq0@iq
Uriendpoint =newUri(String.Format("http://localhost:49955/BookHandler.ashx?No={0}",Books.SelectedIndex));ITPUB个人空间(xR+m2X T&H l
ITPUB个人空间)C jZy[U%\
WebClientclient =newWebClient();ITPUB个人空间 a I4uQ h4U1tq
client.DownloadStringCompleted +=newDownloadStringCompletedEventHandler(client_DownloadStringCompleted);
iz Ku)N;u^:M5nV#P0
Sf y@,_hTSF8lv0client.DownloadStringAsync(endpoint);ITPUB个人空间~'o"CcmF
}
t'l0_,jT*e:|0ITPUB个人空间(r#i`-y#w~
voidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)
_q+Ca.G @['G0{ITPUB个人空间)]WS1NX$I6`p
if(e.Error ==null)ITPUB个人空间g#^"uV"E/w0r
{ITPUB个人空间n0R.]Ko1`G
lblPrice.Text ="价格:"+ e.Result;ITPUB个人空间+ez0VULt-V0`J:{
}ITPUB个人空间0ao+T-JP
else
a#@r)o4` J.M0{$Kv0
{ITPUB个人空间2\h@9QO
lblPrice.Text = e.Error.Message;
,t!VWH:BM/Fp0}ITPUB个人空间1Pky{:i"qb:GI
}
;|#a_,{@0}

运行后效果如下:ITPUB个人空间 w&Q'\[ o Q"x0q1@
ITPUB个人空间#Fx;T-T(Cb)IPC
当我们选择其中一本书籍时,将会显示出它的价格:ITPUB个人空间ik#e\u5j-i/a7sX
ITPUB个人空间5iH6A H v3`

结束语

本文简单介绍了Silverlight 2中使用Web Client进行通信的知识,在Silverlight 2中,提供的通信API非常丰富,后面将会介绍其他的方式。你可以从这里下载本文示例代码。

作者:TerryLeeITPUB个人空间;VN MCQ
出处:http://terrylee.cnblogs.com

ITPUB个人空间F\ZI#OXX^


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar