概述
Silverlight 2 Beta
1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#,
IronRuby, Ironpython,对JSON、Web
Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight
2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。
本文将简单介绍在Silverlight 2中如何与ASMX进行通信。
简单示例
本文的示例非常简单,其过程也跟我们在一步一步学Silverlight 2系列(14):数据与通信之WCF中差不多,我们仍然显示一个最新随笔的列表,最终完成后效果如下所示:ITPUB个人空间$V2qrT\;J+{W6E;E

;H?ksN2X!i Q0
定义一个业务实体Post。
public classPost
K7d$P
i*ko!Eq4\0{ITPUB个人空间8`"~+a"c`7d#p
public intId {get;set; }
s MX7NNF(|hk,u0ITPUB个人空间\#j2`r
P Zk
public stringTitle {get;set; }ITPUB个人空间&K
p m;fiz.O k5x
ITPUB个人空间4b8Q+Pw.Fq \|
public stringAuthor {get;set; }
'f
po.{/jALZr0}
在Web项目中添加一个Web Service文件,命名为BlogService.asmx

实现该服务,定义一个GetPosts方法:
public classBlogService:WebService
H/l
S
[?p G
})t0{
)R2M8B%WWItAR0[WebMethod]ITPUB个人空间mS"t$Y#T;G*Hq0}3d
publicPost[] GetPosts()ITPUB个人空间dpt%hHa
{
L$p}+X _Q0List<Post> posts =newList<Post>()
z"C/M&Lu+N9kq q]1Gd8_a0{ITPUB个人空间am`rn[.`
newPost{ Id=1, Title="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author="TerryLee"},
xwm%Rm,k X8Gg0newPost{ Id=2, Title="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author="TerryLee"},ITPUB个人空间O)]^HW1P
newPost{ Id=3, Title="一步一步学Silverlight 2系列(11):数据绑定", Author="TerryLee"},
;R{JxBf!F0newPost{ Id=4, Title="一步一步学Silverlight 2系列(10):使用用户控件", Author="TerryLee"},ITPUB个人空间'kP-U*o6S[W
newPost{ Id=5, Title="一步一步学Silverlight 2系列(9):使用控件模板", Author="TerryLee"},
H H8sdsGoJ#tW0newPost{ Id=6, Title="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author="TerryLee"}ITPUB个人空间gF4Bny8zG
};
?
Cw+l`.\)m%F4K0ITPUB个人空间H.VJcb9xr
Va
returnposts.ToArray();
-e/o8q&O'i,XT4b0}ITPUB个人空间K'N9Ic^(Y
}
同样设置Web Development Server的端口号为一个固定值,这里设为8081,然后在浏览器中测试服务是否正确:ITPUB个人空间[ B7`4H/x*v1OMd,d

5Nm6}spL.S4T0点击调用后测试服务正确
\9@Wo[)?{g$Lo4o0
'V
I*~)Af8Qh0在Silverlight项目中,添加对服务引用,
)F^B(Ow_ o(F0
#J B%TyhKC\"W-b0使用对象浏览器查看一下生成客户端代理类中的对象:ITPUB个人空间.}:tJU6_1J
ITPUB个人空间;SnhJ)i
编写展示界面,XAML如下,与上一篇中的示例一样:
<GridBackground="#46461F">
!] gr+h3R0<Grid.RowDefinitions>
0D2vt8b,~6V3y
x1pAc*Z0<RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间b&J^m:k'f
<RowDefinitionHeight="*"></RowDefinition>
Ro j[:A dO2kWcYw0</Grid.RowDefinitions>ITPUB个人空间`{.mf)F9B&xa
<Grid.ColumnDefinitions>ITPUB个人空间$c!fpcmL1x
<ColumnDefinition></ColumnDefinition>ITPUB个人空间9M-g!U#w(y
</Grid.ColumnDefinitions>ITPUB个人空间U.x.yF3@3qY}vUtWu
<BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"ITPUB个人空间-v0~qm;hX#j
Width="240"Height="36"Background="Orange"
sg"t$|:G-Mv/^.{0Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间D/u'Xq1e
t
<TextBlockText="最新随笔"Foreground="White"ITPUB个人空间
_rZF5{P\k
HorizontalAlignment="Left"VerticalAlignment="Center"
I
uE#V7z3j,WH\0Margin="20 0 0 0"></TextBlock>ITPUB个人空间6t d uS`-OM
</Border>
7NL+W-x5z)r0<ListBoxx:Name="Posts"Grid.Row="1"Margin="40 10 10 10">
d(@ZKj,P3B0<ListBox.ItemTemplate>ITPUB个人空间'z#P/J|V+h^@ h B
@#h
<DataTemplate>
'?#FZLg!H
zM&F)~0<StackPanelOrientation="Horizontal">
#Sb)rB$`j!SjU0<TextBlockText="{BindingId}"Height="40"Foreground="Red"></TextBlock>
N*T/z:C#q6R/t3g0<TextBlockText="{BindingTitle}"Height="40"></TextBlock>ITPUB个人空间
b{c/_r
w
<TextBlockText="{BindingAuthor}"Height="40"Foreground="Orange"></TextBlock>
3a1[D6Iu k0</StackPanel>
"@b*j`y NsZn9m-ItG0</DataTemplate>ITPUB个人空间JE)O} V}2F;`iX
</ListBox.ItemTemplate>ITPUB个人空间-EX9OyrjP%Y
</ListBox>ITPUB个人空间v
X7f8q)u.E
</Grid>
实现调用ASMX,并进行数据的绑定。仍然采用异步模式,所使用的方法如上图中红色框中的部分。过程与WCF通信差不多,只不过不再需要指定Bingding等信息:
public partial classPage:UserControl
!_]5E(?%P1k8w0{ITPUB个人空间-TR s{/`u*j"]8C
publicPage()
mQ{#\'zo9Hw
xW2W3{
E0{
+|,k"p'eq3z:ub7J0InitializeComponent();ITPUB个人空间.d0E \:iD/sA;|k
}
-Im4IoY/_.]-O0
}6U#IJ(Y$Y6L"V?:r0private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间|w.lajfo:I
{
@#a9v'F
E A[UeM0BlogServiceSoapClientclient =newBlogServiceSoapClient();ITPUB个人空间X%Q*h!qSAM"F
client.GetPostsCompleted +=newEventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);
R1Q UC%w!D1B8Y:M0client.GetPostsAsync();ITPUB个人空间^E"s5}@z/Knk;[Q
}ITPUB个人空间 k(J:O~#Y(y4P5o"E9S}
ITPUB个人空间CT
rS%J0U
voidclient_GetPostsCompleted(objectsender,GetPostsCompletedEventArgse)ITPUB个人空间0WS9z7|LG
{
+Ni-kFQ$ef fxQ0if(e.Error ==null)ITPUB个人空间3_&V7j,P7MDZ
{ITPUB个人空间'owDS{
Posts.ItemsSource = e.Result;
,}$Djo1U+smS j0}ITPUB个人空间
]+e*^"h*u
}ITPUB个人空间"cTJi,T;gs `)E:x
}
一个完整的Silverlight 2中调用ASMX的示例就完成了,运行后效果如下:
G-F#h8n/~(N'^R0结束语
本文简单介绍了在Silverlight 2中如何调用ASMX,你可以从这里下载示例代码。
ITPUB个人空间%Rp Sb2RfW
ZK