.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(14):数据与通信之WCF

上一篇 / 下一篇  2008-04-11 19:48:07

概述

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;
hAc L.Q0sZ0this.Author = author;
.f(^WwlfL5h0}
Z\"`L]3B0
1?U Q5}'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个人空间.c9y8oKL1N
}

在Web项目中添加一个WCF Service文件,命名为Blog.svc

定义服务契约:

[ServiceContract]
]&Hhe,w0public interfaceIBlogITPUB个人空间#`l4z,_9vo.{E
{ITPUB个人空间NRM f7U%WgI5f$i
[OperationContract]ITPUB个人空间 z6q8]?gWI*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]-}[et K `\;_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$J n+a B? O0
W J&i3Q(yH6C+q0returnposts.ToArray();ITPUB个人空间O:d2xd:a&L s~
}ITPUB个人空间N/{+c c"}@8UP
}

修改Web.config中的服务配置,这里使用basicHttpBinding绑定,并且开启httpGetEnabled,以便后面我们可以在浏览器中查看服务:

<system.serviceModel>
X]kc s6Kh2n0<
behaviors>ITPUB个人空间\ A4pP C `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+Vd'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!\0ITPUB个人空间D*\4M#tC"MQU-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.z2K t7n D
EndpointAddressendPoint =newEndpointAddress(ITPUB个人空间P[ ^"wi
"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进行通信,你可以从这里下载示例代码。

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

T%q+q.gg1A[0

1

1

TAG:

 

评分: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