.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去查询书籍的价格,并显示出来,最终的效果如下:ITPUB个人空间q~7\3UzR+Mf(I

]VTU D0

编写界面布局,XAML如下:

<GridBackground="#46461F">
:oi EZ3t0<
Grid.RowDefinitions>ITPUB个人空间3KX{Mw8m+b
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间P p!M3nIbic/e5P
<
RowDefinitionHeight="*"></RowDefinition>ITPUB个人空间 TQylpI
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间!p g:\r y@
</
Grid.RowDefinitions>ITPUB个人空间%Y~s7l"z#C
<
Grid.ColumnDefinitions>ITPUB个人空间T5nuH g&to^
<
ColumnDefinition></ColumnDefinition>ITPUB个人空间/z5f9j @ Rz8{
</
Grid.ColumnDefinitions>
^J8d4E V K0<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"
j/E2V v0\Wm o?p(v0
Width="240"Height="36"
F&f ?7ZGB0
Margin="20 0 0 0"HorizontalAlignment="Left">
g;|,| Chw0<
TextBlockText="书籍列表"Foreground="White"
7QF9h6` LY G1E0
HorizontalAlignment="Left"VerticalAlignment="Center"
t;h]#R#h-w p+m&hM v)r8x0
Margin="20 0 0 0"></TextBlock>
wqJ$\x4T l0</
Border>ITPUB个人空间T6`Syxeg]%U
<
ListBoxx:Name="Books"Grid.Row="1"Margin="40 10 10 10"
gf&po7K9S0
SelectionChanged="Books_SelectionChanged">
]m7B#x@0q0W?0<
ListBox.ItemTemplate>ITPUB个人空间j(k.G6]Bd/_JYG
<
DataTemplate>ITPUB个人空间~8mK/bs'D%v;A
<
StackPanel>
D*_0O5rMj&C*O.M0<
TextBlockText="{BindingName}"Height="32"></TextBlock>ITPUB个人空间6N%Nv3@2`6Z}W
</
StackPanel>ITPUB个人空间;f4C] X6q#U'|
</
DataTemplate>
]}x1Mu? N_.XD qi]0</
ListBox.ItemTemplate>
bc/Ay le!~wvh0</
ListBox>
4J&cx\i \7\$e)?0<
BorderGrid.Row="2"Grid.Column="0"CornerRadius="15"
UbQks:i6t0
Width="240"Height="36"Background="Orange"
6`4H-XFeE0
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间| ~N%^4R)@(J;x1l`0tl
<
TextBlockx:Name="lblPrice"Text="价格:"Foreground="White"
g.^JKM0iNG0
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间ll3\eX:^ x(W`*u
Margin="20 0 0 0"></TextBlock>
7b*sp2EFo0</
Border>ITPUB个人空间3q _ Av8b8K8j,v1I
</
Grid>

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

public classBookHandler:IHttpHandler
0Z2B4~$A gG&J^0
{ITPUB个人空间\v:qw$s"A@
public static readonly string[] PriceList =new string[] {ITPUB个人空间 lb5s u/yX7I
"66.00",ITPUB个人空间#wbiS*mn$\/ah
"78.30",
0Se+k*qHt5sb?I0"56.50",ITPUB个人空间$MI.dY(T8`4z8u
"28.80",
HU(z]h0"77.00"
I|n&S7a8K^L ~.F4|H0
};
!w;rXz$z3T0public voidProcessRequest(HttpContextcontext)ITPUB个人空间*B[]H2`"F1M
{
bkB3AF'Ns&~0context.Response.ContentType ="text/plain";ITPUB个人空间 D#ri-dLhL
context.Response.Write(PriceList[Int32.Parse(context.Request.QueryString["No"])]);ITPUB个人空间OTFRN
}ITPUB个人空间4[2X&d o9nBq)wRSN
ITPUB个人空间*H2hAkv p
public boolIsReusable
F4D6q7Tz.t0{
.|.H!KZ r-UK0getITPUB个人空间e3wJ bd,}Ni R
{
*qUnP0S ZZb0return false;
9c%L `b}D\O-J0}ITPUB个人空间a\q]"eNu-y;M
}ITPUB个人空间D Y~1?(pT2| A0g
}

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

voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间gaZ-P0R(I'@
ZF
{ITPUB个人空间`:q Q0lAz@,C,Vm/_6h
List<Book> books =newList<Book>() {ITPUB个人空间#F!Q1`sXL:{
newBook("Professional ASP.NET 3.5"),ITPUB个人空间kPcW:bB2F
newBook("ASP.NET AJAX In Action"),
5N;wH/h1Q5L)\\0newBook("Silverlight In Action"),
/?'d CA't9B%`kf!p0newBook("ASP.NET 3.5 Unleashed"),
$Tq%? X*ac0newBook("Introducing Microsoft ASP.NET AJAX")ITPUB个人空间7K0k@*UE{u@\
};ITPUB个人空间2j.y5| f\e'j+L

;f~ u thW0Books.ItemsSource = books;
IR}:mt#D0ITPUB个人空间5p5W,nqeO"l
}

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

voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)
!o] kd{:k;M5D"F6a#v0{ITPUB个人空间*W$qw6|b/Up
Uriendpoint =newUri(String.Format("http://localhost:49955/BookHandler.ashx?No={0}",Books.SelectedIndex));ITPUB个人空间ges*I$h9U.X{
ITPUB个人空间&pf w)z^s E]4~C S:M$~p
WebClientclient =newWebClient();ITPUB个人空间.Gwk t-d;g|o5u
client.DownloadStringCompleted +=newDownloadStringCompletedEventHandler(client_DownloadStringCompleted);
Ts"iD{x0ITPUB个人空间"m6Yw!np-lY4e.|
client.DownloadStringAsync(endpoint);ITPUB个人空间$d0E K#_#~u'MU
}
5Fn%Q7\IyR9_~0
)Bo)^1V:p0voidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)ITPUB个人空间+_hz Q!w3}5I-L
{ITPUB个人空间7C(M4@W#j)q'g*QpS
if(e.Error ==null)
(Ig/R4\,a8Dvw:I0{ITPUB个人空间.|\_+y;nTy-@9Y
lblPrice.Text ="价格:"+ e.Result;
+Xf8a4u ^2]:B9l2m0}
;IQ&^/sz ?0else
*B E(MP0J7~ NH"a0
{ITPUB个人空间w!Ky%a-yX,tS'CC X
lblPrice.Text = e.Error.Message;ITPUB个人空间4PzU;K8| A8pt
}ITPUB个人空间t&R/D |T0ciJ
}

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


)B5Ni,?#g N2b SO-}1z0

最后完整的代码如下:

public partial classPage:UserControl
m,b&Xa?:tk3PWI7s0
{
vul!cv6i0publicPage()
Fo;THm[`0{ITPUB个人空间Yyw m$\3kI b
InitializeComponent();ITPUB个人空间+|N5W.p^Gt*R
}ITPUB个人空间"_ A yG2Z e'w,\(FiN
ITPUB个人空间1m7j$X&[jC'e
voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间 p@+w4G&n.D/T%Gr V
{
?n%zII0List<Book> books =newList<Book>() {
5I7FH.~7q1yW;R\0newBook("Professional ASP.NET 3.5"),
?]l][ nU0newBook("ASP.NET AJAX In Action"),ITPUB个人空间yT Pj#se2~n
newBook("Silverlight In Action"),ITPUB个人空间V#_fD4pdr
newBook("ASP.NET 3.5 Unleashed"),ITPUB个人空间Jvujs3p
newBook("Introducing Microsoft ASP.NET AJAX")
'qV)WHo5eNF0};ITPUB个人空间2[{B9Q&e+Q+I4m,v

q R!D-jE+W0Books.ItemsSource = books;
m#[ Y3l'T#]0ITPUB个人空间a^ U/O[D
}
9w3bymvim k8Q$@0
"W0g{4a/W}a[0voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)
Wg"_yq`~2mu0{ITPUB个人空间j0Fc%H!_B J*w
Uriendpoint =newUri(String.Format("http://localhost:49955/BookHandler.ashx?No={0}",Books.SelectedIndex));
]Tm@8rj0ITPUB个人空间 M w {s'E6e/V;C@J2j w
WebClientclient =newWebClient();ITPUB个人空间nZ+Z+tu-]sz
client.DownloadStringCompleted +=newDownloadStringCompletedEventHandler(client_DownloadStringCompleted);
#lC!CaDzNy0ITPUB个人空间xd(reS\
client.DownloadStringAsync(endpoint);
S$zD g/FA2UF0}ITPUB个人空间\b$Z#?(bw'UJp
ITPUB个人空间2v D8k4O#@6j Em3P
voidclient_DownloadStringCompleted(objectsender,DownloadStringCompletedEventArgse)ITPUB个人空间'^ GW2G~&C7p
{
@B a-VQi(k0B0if(e.Error ==null)
S y_7GC6NHH0{
V+@*tp+T}XX0lblPrice.Text ="价格:"+ e.Result;
\7~r}$['rt0}ITPUB个人空间]$z#? |3NG)K+~
else
!R g2_WWdu0
{
[@e na+y O^ouP3v0lblPrice.Text = e.Error.Message;
6T*Z.b+J5RV3~8Z0H;`0}ITPUB个人空间jMrKYNN%W_
}
$jD&nt0@_0}

运行后效果如下:ITPUB个人空间u)dsuI P3A
ITPUB个人空间}Aj^8rc b9w"\:f
当我们选择其中一本书籍时,将会显示出它的价格:ITPUB个人空间{yd*AFR"B)i

2_'_Y4g-K7Xd0

结束语

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

作者:TerryLeeITPUB个人空间Bj6v bc
出处:http://terrylee.cnblogs.com


g H4o#g9]_LA.WT8D0


TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-10-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 44879
  • 日志数: 1151
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2008-10-07

RSS订阅

Open Toolbar