概述
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中如何与WCF进行通信。
简单示例
在本示例中,我们将通过WCF来获取一个最新随笔的列表,在Silverlight中显示出来,最终完后效果如下所示。
pAon
WKr hF*G0
ITPUB个人空间JvyZ:M?a&c+w+P
先定义一个数据契约:
[DataContract]ITPUB个人空间8k"ie7Y[2~
public classPost
&\6[i
~O5t9P5n/ZME0{ITPUB个人空间OBp/og!p:A _ x_
publicPost(intid,stringtitle,stringauthor)ITPUB个人空间B jlut,dJN
{
#m LM-{)b9lIf0this.Id = id;
(}:|+L8_$s0I0this.Title = title;ITPUB个人空间pQ/qJmA#c6o
this.Author = author;
@v_5Cz1|K0}ITPUB个人空间ai)tjO
ITPUB个人空间lP-w3H0yPGj#H!EI%^
[DataMember]
I+WEB9G1h0public intId {get;set; }ITPUB个人空间5z!QO*d gT;O"hR
r]*sF3V4])Zl0[DataMember]
%~:o2^s;n;q U0public stringTitle {get;set; }
1lD;M,IwA0
6M!y1U!dvjc0[DataMember]ITPUB个人空间 |3WA-Q9|$sD
public stringAuthor {get;set; }ITPUB个人空间o k buRM8eC:Q
}
在Web项目中添加一个WCF Service文件,命名为Blog.svc

定义服务契约:
[ServiceContract]ITPUB个人空间f}f@h `"p8w
public interfaceIBlogITPUB个人空间'm!f]1?;o@
{
0y#`#{
]/D$aCv`D0[OperationContract]
|+{4w5v/a$?0Post[] GetPosts();
p/~ s~ ~2NK/ov0}
实现服务,这里可以是从数据库或者其他数据源读取,为了演示方便,我们直接初始化一个集合:
public classBlog:IBlogITPUB个人空间cJu2k i1Fx
{
E|,{CV3p-O2wb{y0publicPost[] GetPosts()ITPUB个人空间(Ra~T@k
{ITPUB个人空间l_6d[@xW(q F%u
List<Post> posts =newList<Post>()
X)Nk[-V.teq0{ITPUB个人空间#MI$@Xt%{v5d"m
newPost(1,"一步一步学Silverlight 2系列(13):数据与通信之WebRequest","TerryLee"),
9is
x.sG%K0newPost(2,"一步一步学Silverlight 2系列(12):数据与通信之WebClient","TerryLee"),ITPUB个人空间2A0Y-f9S r&f4P8j
newPost(3,"一步一步学Silverlight 2系列(11):数据绑定","TerryLee"),
H8b.F(NbVc0newPost(4,"一步一步学Silverlight 2系列(10):使用用户控件","TerryLee"),
D/Y3W(y`Ej0newPost(5,"一步一步学Silverlight 2系列(9):使用控件模板","TerryLee"),
6a8x^ w8p3`5s
MI0newPost(6,"一步一步学Silverlight 2系列(8):使用样式封装控件观感","TerryLee")
)P,SYI`p8BR-x0};
:n7Q%ut*y0]f-O0
9ER%mW-H)G.W0returnposts.ToArray();ITPUB个人空间}8Y~2~ P#][H m8HACw
}
n^!\
E j&_0}
修改Web.config中的服务配置,这里使用basicHttpBinding绑定,并且开启httpGetEnabled,以便后面我们可以在浏览器中查看服务:
<system.serviceModel>
g.GUlH&j0<behaviors>
/^6r9b:sI0<serviceBehaviors>
8VL/@*U(aNy_!e0<behavior.name="TerryLee.SilverlightDemo27Web.BlogBehavior">
d
snhr0<serviceMetadatahttpGetEnabled="true"/>
5X
]8W;m^Bf_aHC0<serviceDebugincludeExceptionDetailInFaults="false"/>ITPUB个人空间pI
l/Q*s
</behavior>
z2]9h yJ;y?ni0</serviceBehaviors>
#N;\:JKJz0</behaviors>
;HQi8G
G9LZ?#~K0<services>
7W|,xqDL0<servicebehaviorConfiguration="TerryLee.SilverlightDemo27Web.BlogBehavior"ITPUB个人空间@#E]b rM(a v\
name="TerryLee.SilverlightDemo27Web.Blog">ITPUB个人空间&f)r R3N']"}$U8\1@
<endpointaddress=""binding="basicHttpBinding"contract="TerryLee.SilverlightDemo27Web.IBlog">
2zyx)kQCi0</endpoint>ITPUB个人空间?$s5KZ:^eH
</service>ITPUB个人空间K1N3d.QFb
</services>
z){9U*J*P
Tz0</system.serviceModel>
设置一下Web应用程序的端口号为固定端口52424,在浏览器中输入http://localhost:52424/Blog.svc,看看服务是否正常:
c/RD;t7I$E
c8r0
1~WX%?#L1v
a0添加完成后,我们可以在对象浏览器中浏览一下生成的客户端对象:
^hEd)b_}~0
M2z{wZ'c0
-g\ho/@0
当然大家也可以手工去编写客户端的代码,请参考WCF的相关内容,这里不再赘述。下面编写调用服务并获取数据,这里仍然是采用异步模式,由于在
WCF服务的配置中我们采取了BasicHttpBinding,客户端也要采用BasicHttpBinding。我们需要注册
GetPostsCompleted事件处理方法,以便完成后回调,同时调用GetPostsAsync()方法获取数据。完整的代码如下所示:
public partial classPage:UserControlITPUB个人空间7F C~$b"Fm8y+{
{ITPUB个人空间?fe5q4Nmf@6s?1I
publicPage()
]'N9PTx \0{ITPUB个人空间6G%n$]a(RUH
Z2L/`
InitializeComponent();
vejX/I#V(FF0}ITPUB个人空间 WvC3~;i
ITPUB个人空间|
N$Nf H e-I
private voidUserControl_Loaded(objectsender,RoutedEventArgse)
L.L`2`3Ko!E0{
2I"H;u,@sQi)i,Ze0Bindingbinding =newBasicHttpBinding();ITPUB个人空间&|.h VR#j{.d&D
EndpointAddressendPoint =newEndpointAddress(ITPUB个人空间 n
LM2j6cd3n;Y
"http://localhost:52424/Blog.svc");ITPUB个人空间{5gd3Qb RH
*z#V |
f.Hd/Z p/I0BlogClientclient =newBlogClient(binding, endPoint);ITPUB个人空间
{5c^?'M)R t
client.GetPostsCompleted +=newEventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);ITPUB个人空间}W!}#qffK5bhiy
client.GetPostsAsync();ITPUB个人空间
RXg/u4g]Q']
}
*evF3@9mx&W/|0
R+g6W'FV&axGL+Dp0voidclient_GetPostsCompleted(objectsender,GetPostsCompletedEventArgse)ITPUB个人空间|jlYi(ZI
{ITPUB个人空间(tw1nE6d j
if(e.Error ==null)ITPUB个人空间C4z.RM
^"S9@^{
{ITPUB个人空间Jz&{.wmZ8}
Posts.ItemsSource = e.Result;ITPUB个人空间 {5IVt5W3z'q3]T
}ITPUB个人空间N;C~4DA
Z/w }/a4hI
}ITPUB个人空间TubjP]5R.aw
}至此,一个完整的在Silverlight 2中调用WCF的示例就完成了,运行后效果如下:
ITPUB个人空间l2dr|L'i!RZe结束语
本文简单演示了在Silverlight 2中如何与WCF进行通信,你可以从这里下载示例代码。
ITPUB个人空间 }@+q{3yc
1