概述
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中显示出来,最终完后效果如下所示。ITPUB个人空间0B:C\5Wwz&{-a"@L

P
w7ne,j \5vFz0
先定义一个数据契约:
[DataContract]ITPUB个人空间I,|@_Tt][6\
public classPost
[y*c]x?(Eec/H0{ITPUB个人空间~%cw)c/y/t*Rm
publicPost(intid,stringtitle,stringauthor)
5@0z1["g`$RG0{ITPUB个人空间5g5e G:O0r8p
~esR
this.Id = id;
Z/m`
v;Kht2I,y0this.Title = title;
h Ac
L.Q0sZ0this.Author = author;
.f(^WwlfL5h0}
Z\"`L]3B0
1?UQ5}'T!eH0[DataMember]ITPUB个人空间$I7Prc*O&gquIC*s
public intId {get;set; }ITPUB个人空间lH2A~C
ITPUB个人空间%o"i{$GL;c.]j
[DataMember]ITPUB个人空间6YEO2_T
public stringTitle {get;set; }
1j
DK"y~ KMM%df0ITPUB个人空间#R\(eDxL0M1E
[DataMember]
nWX(w0oedR[8}@0public stringAuthor {get;set; }ITPUB个人空间.c9y8o KL1N
}
在Web项目中添加一个WCF Service文件,命名为Blog.svc

定义服务契约:
[ServiceContract]
]&Hhe,w0public interfaceIBlogITPUB个人空间#`l4z,_9vo.{E
{ITPUB个人空间NRMf7U%WgI5f$i
[OperationContract]ITPUB个人空间
z6q8]?g WI*l4~C$I
Post[] GetPosts();ITPUB个人空间 P+y
{(kX;kI-IN
}
实现服务,这里可以是从数据库或者其他数据源读取,为了演示方便,我们直接初始化一个集合:
public classBlog:IBlogITPUB个人空间.q2P)f_fE4QZw%?
{
d%g6M!p@i`x0publicPost[] GetPosts()
Tn.u
~1\0{
~"B;r6z)q0List<Post> posts =newList<Post>()
)O3?ZY&`,l0W A0{
J]-}[etK `\;_0newPost(1,"一步一步学Silverlight 2系列(13):数据与通信之WebRequest","TerryLee"),
x#m muo?Gf,R;j0newPost(2,"一步一步学Silverlight 2系列(12):数据与通信之WebClient","TerryLee"),
6_0N.Nu
A `l0newPost(3,"一步一步学Silverlight 2系列(11):数据绑定","TerryLee"),
)^)Y"Rv&Oawr0newPost(4,"一步一步学Silverlight 2系列(10):使用用户控件","TerryLee"),ITPUB个人空间
cX#B7PZ'Hib"P
newPost(5,"一步一步学Silverlight 2系列(9):使用控件模板","TerryLee"),ITPUB个人空间Liy U9E/Dkz{+f4{
newPost(6,"一步一步学Silverlight 2系列(8):使用样式封装控件观感","TerryLee")ITPUB个人空间HQ,v8Krj;|
};
b|y$Jn+aB? O0
WJ&i3Q(yH6C+q0returnposts.ToArray();ITPUB个人空间O:d2xd:a&L s~
}ITPUB个人空间N/{+cc"}@8UP
}
修改Web.config中的服务配置,这里使用basicHttpBinding绑定,并且开启httpGetEnabled,以便后面我们可以在浏览器中查看服务:
<system.serviceModel>
X ]kcs6Kh2n0<behaviors>ITPUB个人空间\
A4pPC`a
<serviceBehaviors>
*CG`W$N&G0<behavior.name="TerryLee.SilverlightDemo27Web.BlogBehavior">
2\R P z.d:W0<serviceMetadatahttpGetEnabled="true"/>
]+i%^*ab6_%fx!v"J6f0<serviceDebugincludeExceptionDetailInFaults="false"/>
nhW"X+C0p0</behavior>ITPUB个人空间A%d;bB|z/B
</serviceBehaviors>ITPUB个人空间A#C]6{G+V d'tSY
</behaviors>
(y
[,A4Z@2Z4X%?0<services>ITPUB个人空间.b+G5zg/G"g!a
<servicebehaviorConfiguration="TerryLee.SilverlightDemo27Web.BlogBehavior"ITPUB个人空间'`DAo'r
D.|^j
name="TerryLee.SilverlightDemo27Web.Blog">ITPUB个人空间I
T
l2}wg|-e
<endpointaddress=""binding="basicHttpBinding"contract="TerryLee.SilverlightDemo27Web.IBlog">
St*kB6Lk7k5^$Qv0</endpoint>ITPUB个人空间_du d(u1A
</service>
d&ZH#FZ!O+Rl1d5{0</services>
%H{2Xrb-h)\&H1a0</system.serviceModel>
设置一下Web应用程序的端口号为固定端口52424,在浏览器中输入http://localhost:52424/Blog.svc,看看服务是否正常:
F+m};H:X,V#CH+[l7Q0
@h*w [rC|r0添加完成后,我们可以在对象浏览器中浏览一下生成的客户端对象:
r T5j0my,X^%H/tV!\0
ITPUB个人空间D*\4M#tC"MQ U-U
ITPUB个人空间7NT9Yc0SF
当然大家也可以手工去编写客户端的代码,请参考WCF的相关内容,这里不再赘述。下面编写调用服务并获取数据,这里仍然是采用异步模式,由于在
WCF服务的配置中我们采取了BasicHttpBinding,客户端也要采用BasicHttpBinding。我们需要注册
GetPostsCompleted事件处理方法,以便完成后回调,同时调用GetPostsAsync()方法获取数据。完整的代码如下所示:
public partial classPage:UserControlITPUB个人空间'G t;@J5[%r
{ITPUB个人空间S%DFNQ{Z
publicPage()
$Vw6x0Awl/`0{ITPUB个人空间d,g!t'n'q:Pm4N
InitializeComponent();
f+{-JmVEk3G0}ITPUB个人空间7GeO
P!DV
ITPUB个人空间 S@}U8?"V
private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间$yB6Pd!g0Iq(T
{
&Sow2Z*WB'e\&`I0Bindingbinding =newBasicHttpBinding();ITPUB个人空间H!kk.z2Kt7n D
EndpointAddressendPoint =newEndpointAddress(ITPUB个人空间P[^"w i
"http://localhost:52424/Blog.svc");ITPUB个人空间6X_$EJv3ebc
;Q9Y_V(U2Z2V;d0BlogClientclient =newBlogClient(binding, endPoint);
hmsFr0Q?0client.GetPostsCompleted +=newEventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);
0~B"WlX`'S6C0client.GetPostsAsync();ITPUB个人空间
GR2u!|J:|Y%V9M
}ITPUB个人空间^#^(Sl
\uM@
I"S_
A^8?J0voidclient_GetPostsCompleted(objectsender,GetPostsCompletedEventArgse)ITPUB个人空间FNQ{r
r X+}m8h
{
q'^F
d&D2qSI?0if(e.Error ==null)ITPUB个人空间5w I{#PHK/jb
{
Whn7?YC0Posts.ItemsSource = e.Result;ITPUB个人空间fIGZ#W'a(A I%I
}ITPUB个人空间h7V1|Y2RO
}ITPUB个人空间}vj-}B\2p#u
}
至此,一个完整的在Silverlight 2中调用WCF的示例就完成了,运行后效果如下:
ITPUB个人空间e)d#L^ GO!@7i%`结束语
本文简单演示了在Silverlight 2中如何与WCF进行通信,你可以从这里下载示例代码。
T%q+q.gg1A[0
1