.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中显示出来,最终完后效果如下所示。
pAon WKr hF*G0ITPUB个人空间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个人空间Bjlut,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*dgT;O"hR

r]*sF3V4])Zl0[DataMember]
%~:o2^s;n;q U0public stringTitle {get;set; }
1lD;M,Iw A0
6M!y1U!d vjc0[DataMember]ITPUB个人空间|3WA-Q9|$sD
public stringAuthor {get;set; }ITPUB个人空间o k b uRM8eC: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个人空间cJu2ki1Fx
{
E|,{CV3p-O2wb{y0publicPost[] GetPosts()ITPUB个人空间(Ra~T@k
{ITPUB个人空间l_6d[@xW(qF%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(Nb Vc0newPost(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|,xqD L0<
servicebehaviorConfiguration="TerryLee.SilverlightDemo27Web.BlogBehavior"ITPUB个人空间@#E]b rM(av\
name="TerryLee.SilverlightDemo27Web.Blog">ITPUB个人空间&f)rR3N']"}$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个人空间7FC~$b"Fm8y+{
{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,@sQ i)i,Ze0Bindingbinding =newBasicHttpBinding();ITPUB个人空间&|.h VR#j{.d&D
EndpointAddressendPoint =newEndpointAddress(ITPUB个人空间n LM2j6cd3n;Y
"http://localhost:52424/Blog.svc");ITPUB个人空间{5gd3Qb R H

*z#V | f.Hd/Z p/I0BlogClientclient =newBlogClient(binding, endPoint);ITPUB个人空间 {5c^?'M)Rt
client.GetPostsCompleted +=newEventHandler<GetPostsCompletedEventArgs>(client_GetPostsCompleted);ITPUB个人空间}W!}#qffK5bhi y
client.GetPostsAsync();ITPUB个人空间 RXg/u4g]Q']
}
*evF3@9mx&W/|0
R+g6W'FV&axGL+Dp0voidclient_GetPostsCompleted(objectsender,GetPostsCompletedEventArgse)ITPUB个人空间|jl Yi(ZI
{ITPUB个人空间(tw1nE6dj
if(e.Error ==null)ITPUB个人空间C4z.RM ^"S9@^{
{ITPUB个人空间Jz&{.w m Z8}
Posts.ItemsSource = e.Result;ITPUB个人空间{5IVt5W3z'q3]T
}ITPUB个人空间N;C ~4DA Z/w }/a4hI
}ITPUB个人空间TubjP ]5R.a w
}

至此,一个完整的在Silverlight 2中调用WCF的示例就完成了,运行后效果如下:

ITPUB个人空间l2dr|L'i!RZe

结束语

本文简单演示了在Silverlight 2中如何与WCF进行通信,你可以从这里下载示例代码。

作者:TerryLee
iRK5n*k0出处:http://terrylee.cnblogs.com
ITPUB个人空间 }@+q{3yc

1

1

TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-07-24  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 25805
  • 日志数: 762
  • 影音数: 7
  • 建立时间: 2008-01-04
  • 更新时间: 2008-07-24

RSS订阅

Open Toolbar