.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去查询书籍的价格,并显示出来,最终的效果如下:
3Z3o1?t)c$O!Gl0ITPUB个人空间4IEXz/`j

编写界面布局,XAML如下:

<GridBackground="#46461F">ITPUB个人空间#xG%z*F8d%\5cQ
<
Grid.RowDefinitions>ITPUB个人空间 I1at lqCl#[]
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间"?2Z!s3w#KN:]|x;t'_-k
<
RowDefinitionHeight="*"></RowDefinition>ITPUB个人空间4U ^_M9n7j:d
<
RowDefinitionHeight="40"></RowDefinition>
B VI$y&Kg G0</
Grid.RowDefinitions>
1?;Psb"_u+L0<
Grid.ColumnDefinitions>ITPUB个人空间.Y A y-~-JN#X'?&f/u
<
ColumnDefinition></ColumnDefinition>
7lY(VY+t7Nt0</
Grid.ColumnDefinitions>ITPUB个人空间%?M.R0A.`Iq;\:Mo
<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"ITPUB个人空间(~R4tG4{Eg-HA
Width="240"Height="36"
4n3b0X ym"f6cj0
Margin="20 0 0 0"HorizontalAlignment="Left">
/W*]JjO+jo&qH:_0<
TextBlockText="书籍列表"Foreground="White"
&EJ[k'RL@&H:l^0
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间5_|t8H3A8P1P'j
Margin="20 0 0 0"></TextBlock>
3D7xsW:o0xZ L'V9s0</
Border>
]2coh4P3i0<
ListBoxx:Name="Books"Grid.Row="1"Margin="40 10 10 10"ITPUB个人空间2OQwe3D1}^
SelectionChanged="Books_SelectionChanged">
jsyB(g a jR0<
ListBox.ItemTemplate>
e/WA(]yJj/?\ MZ0<
DataTemplate>
p)|*Yq:N9N$FW$J;N5_n6G0<
StackPanel>ITPUB个人空间;^BtI Xc0]:_
<
TextBlockText="{BindingName}"Height="32"></TextBlock>ITPUB个人空间c&V&U0jz I[
</
StackPanel>
:^8A Xav%Z ?;k0</
DataTemplate>ITPUB个人空间O!l T8QyIsvT$R
</
ListBox.ItemTemplate>
S-T!^.Oo)CeTZ0</
ListBox>
4AoJ o7n0<
BorderGrid.Row="2"Grid.Column="0"CornerRadius="15"
.|Gn)L7_v0
Width="240"Height="36"Background="Orange"
3noF3[(v|$M0
Margin="20 0 0 0"HorizontalAlignment="Left">
g ~ g$HGW^#B0<
TextBlockx:Name="lblPrice"Text="价格:"Foreground="White"ITPUB个人空间 R6{+[v x0C,L1N
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间V9B w7r"`;FG
Margin="20 0 0 0"></TextBlock>
+X+@_6H!l.^{t r0</
Border>ITPUB个人空间8G-Mz:Q;F3G0{*A
</
Grid>

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

public classBookHandler:IHttpHandler
MB+B{&r _ a(zk2J0
{
adm"YZ i/u0public static readonly string[] PriceList =new string[] {
H*wB6S9lp1Xu0"66.00",ITPUB个人空间y [8y \ d$TF%B
"78.30",ITPUB个人空间d@!BY+H xhS4w!e
"56.50",
i)E?d-S4AC"Rt0"28.80",
HQ^4S;zy BZ0"77.00"ITPUB个人空间E%O;H7?s5[
};ITPUB个人空间W(O\ \B
public voidProcessRequest(HttpContextcontext)ITPUB个人空间'tZ puY e"p!Fg)}
{ITPUB个人空间ol)X"_ShI
context.Response.ContentType ="text/plain";
;P9c&u3M(?n||!i^0context.Response.Write(PriceList[Int32.Parse(context.Request.QueryString["No"])]);ITPUB个人空间"d8C&UFRWs%c S%o
}ITPUB个人空间 AC:Vb4z {
ITPUB个人空间a$GIm&t J
public boolIsReusableITPUB个人空间;h0y"E'tL6OiO1b?
{
'D0~:w:hL}0get
_&k-?0JUg _)I/a0
{ITPUB个人空间 lW:K,`l]
return false;
4Q(l4x.y}6nY0}
)N*W4i%^g M.W/XHs]0}
$B*\ IU#{omEp5f$H0}

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

voidUserControl_Loaded(objectsender,RoutedEventArgse)
W*t*p~AX@Q0{
O vgZNp0List<Book> books =newList<Book>() {
c8RL7{,Y-yM Y&e @F0newBook("Professional ASP.NET 3.5"),
7J"Lw [\p#X!Mc0newBook("ASP.NET AJAX In Action"),ITPUB个人空间vJ(z2R|I/gp
newBook("Silverlight In Action"),ITPUB个人空间 I,fW0K9njL
newBook("ASP.NET 3.5 Unleashed"),
p/\.D'K?c/{3n0newBook("Introducing Microsoft ASP.NET AJAX")
[}"`9{`Dwm0};
;dUlf+dqVl,d5c0
HTRN+SxrS0Books.ItemsSource = books;ITPUB个人空间pQ4@4W3["F7Dpe

#_0oQmA0}

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

voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)ITPUB个人空间$hT
p0{
Ca%Q3J
{ITPUB个人空间 IiBB[-w6P2W
Uriendpoint =newUri(String.Format("http://localhost:49955/BookHandler.ashx?No={0}",Books.SelectedIndex));
Q^c5eno^2`0
\1Ho*Zi I$C0WebClientclient =newWebClient();
1_5D1b1zk d@p0client.DownloadStringCompleted +=newDownloadStringCompletedEventHandler(client_DownloadStringCompleted);ITPUB个人空间O/q-_3l!ET
ITPUB个人空间]bi7sPMwm
client.DownloadStringAsync(endpoint);
7U(}*p5b1X(dQ ~"c0}ITPUB个人空间 ^NOsH#^(C/f r

[;S {bR4]T/N0voidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)ITPUB个人空间+KNH D/p|8IzVzd
{ITPUB个人空间6t K7i8r8N
if(e.Error ==null)ITPUB个人空间.UA"kh Vy
{
/zvJ1f `;j YP0lblPrice.Text ="价格:"+ e.Result;ITPUB个人空间QLPVa`C
}ITPUB个人空间Fl.nK#E(P fmM
else
J9kQh^"\ Z3}0
{ITPUB个人空间H\1MIZ0QQJ
lblPrice.Text = e.Error.Message;ITPUB个人空间.v7q+i!_sB#Q
}ITPUB个人空间4L0K[$k:c+n/s
}

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


,\?\3B*a"Xb,Yw0

最后完整的代码如下:

public partial classPage:UserControlITPUB个人空间STFs
av$wl2e
{
/fb8Jg n@.N#L0publicPage()ITPUB个人空间)wxf4a[!rxI#z
{ITPUB个人空间Cs0Kn mf
InitializeComponent();
z~#Js8yl&q0}
DFe,Z6\\6@/@.Q0
uY7x.U e+KP F|0voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间|#m'o3Ux6yo(W
{
6H8?3cg)A0List<Book> books =newList<Book>() {
f1s t6\y4?0newBook("Professional ASP.NET 3.5"),ITPUB个人空间0@"@{tfj
newBook("ASP.NET AJAX In Action"),
S{1Ut7G0newBook("Silverlight In Action"),ITPUB个人空间;w2c!i9_-Z:|
newBook("ASP.NET 3.5 Unleashed"),
i@h%M |;R0newBook("Introducing Microsoft ASP.NET AJAX")ITPUB个人空间3rzB c8]#QQ1Z]d Q
};ITPUB个人空间l6ClLe[i.S&u

0e h8tRH?:@w,r0Books.ItemsSource = books;ITPUB个人空间1Nk2jX j
ITPUB个人空间N'ZF\4S(q|
}
1x+iu!Djx0ITPUB个人空间-W8]%p a bf:d
voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)ITPUB个人空间/Cv[-Y(i0Nc^,x B
{
3M$K'uO K(md+V0Uriendpoint =newUri(String.Format("http://localhost:49955/BookHandler.ashx?No={0}",Books.SelectedIndex));ITPUB个人空间5KL?)N1b k
ITPUB个人空间"V Q8Mm4T'~0`
WebClientclient =newWebClient();ITPUB个人空间'zXe!`eg0lF4zoJ
client.DownloadStringCompleted +=newDownloadStringCompletedEventHandler(client_DownloadStringCompleted);
#R,f&t/H.s-a |0
l-@_@.k@lt`0client.DownloadStringAsync(endpoint);ITPUB个人空间l!bO.R,|hp
}
N Yl`J"K3H K-J0
4} b1G0N.r1O||*]0voidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)ITPUB个人空间QG7S FTLm2\*E
{
*Y] n2`1z*I%M W:H ~}0if(e.Error ==null)ITPUB个人空间$fdNFg
{ITPUB个人空间n o1v Cw!q.^U[$|
lblPrice.Text ="价格:"+ e.Result;ITPUB个人空间!k;[-d5} \
}ITPUB个人空间-F3Dz'Q5d5a
else
oF/x:W%[)O l0
{ITPUB个人空间,J3N]lG'@+[ U
lblPrice.Text = e.Error.Message;ITPUB个人空间%wU'x%_dWf
}ITPUB个人空间)AJ&j zU w%\5xY
}
3x,bx` HIg0}

运行后效果如下:
qf*NcJ*c0
%h v$q T|WC6R0当我们选择其中一本书籍时,将会显示出它的价格:
qR&H RNzw:v? o0
B3a;N9kRT1qu0

结束语

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

作者:TerryLee
%OXZ&N2^7UV1W0出处:http://terrylee.cnblogs.com


S~#[%x zZ0


TAG:

引用 删除 Guest   /   2011-06-23 10:53:27
5
 

评分:0

我来说两句

显示全部

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

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665817
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar