.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services

上一篇 / 下一篇  2008-04-11 20:14:43

概述

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中如何调用ADO.NET Data Services。

准备知识

由于ADO.NET Data Services是在ASP.NET 3.5 Extensions中,所以在开始本文示例之前,首先要安装一下ASP.NET 3.5 Extensions最新版本,你可以从这里下载。安装完成后,在添加新项对话框中应该能够看到ADO.NET Data Service项:ITPUB个人空间e(]wZ^,w Y Y smZ

+lXCY1k"tw0

ADO.NET Data Service允许应用程序把数据以服务的形式公开,这样我们就可以通过浏览器来直接访问数据,它支持开放的业界标准,如AtomPub和JSON。它支 持标准的HTTP动作如POST、GET、PUT、DELETE,用来完成数据的创建、更新、删除和读取。ADO.NET Data Service的知识这里不再多说,大家可以去查看相关的资料。

简单示例

如果大家看了前面三篇文章的话,可能对于下面的这个界面已经很烦了,不过在本文我会仍然采用这个示例进行演示:)
4n(l k9_eB8n^0ITPUB个人空间 j$F`R3\#Fm ~ O

建立完Silverlight 2项目之后,我们在Web项目中添加一个Post类:

public classPost
7i5yW"c O$?7]g0
{
cfb5aV`M$a*m1D N0public intId {get;set; }ITPUB个人空间+{#qi @.zA U7^
ITPUB个人空间BgqJ loF-D)U
public stringTitle {get;set; }ITPUB个人空间 fA#j Tt

pm~"C7HG J }0public stringAuthor {get;set; }ITPUB个人空间 E%e&_"~o pB@~8u
}

我们用Id作为Post的主键,这里需要添加对于Microsoft.Data.Web.dll程序集的引用,位于<盘符>\ Program Files\Reference Assemblies\Microsoft\Framework\ASP.NET 3.5 Extensions下面,引入命名空间using Microsoft.Data.Web,并且为Id加上[DataWebKey]特性,最终完成后代码应该如下:

public classPostITPUB个人空间`5t:w0Z.|X	Fu5n
{
G!DY.N-P0[DataWebKey]
3|'wf9D%`Y6]F0public intId {get;set; }ITPUB个人空间^,r,~2X)e

s h] r$H Im|0public stringTitle {get;set; }
Z8zf2z4qX0
2eBLb9ux/O0public stringAuthor {get;set; }ITPUB个人空间w4U |9Y;}+ofP!e
}

再添加一个Blog类,它有一个返回类型为IQueryable<Post>的属性Posts:

public classBlog
vE_X5ZW6g0X/] W]0
{ITPUB个人空间)jZ'I;y$i)I
publicBlog()ITPUB个人空间T @ x:Rc)K:]&h
{
GH a3IFcE-}0_post.Add(newPost{ Id = 1, Title ="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author ="TerryLee"});ITPUB个人空间%D V}6F,[k8CQ
_post.Add(newPost{ Id = 2, Title ="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author ="TerryLee"});
,I}_K(Hrq'h{r0_post.Add(newPost{ Id = 3, Title ="一步一步学Silverlight 2系列(11):数据绑定", Author ="TerryLee"});
yU ].Yu w!^0_post.Add(newPost{ Id = 4, Title ="一步一步学Silverlight 2系列(10):使用用户控件", Author ="TerryLee"});ITPUB个人空间Y$ro*}&M4r&KP
_post.Add(newPost{ Id = 5, Title ="一步一步学Silverlight 2系列(9):使用控件模板", Author ="TerryLee"});
Q^m5f_]m/p H@`K0_post.Add(newPost{ Id = 6, Title ="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author ="TerryLee"});ITPUB个人空间;s"VOz!p@:X
}
,|"N3E!BU6N%V0ITPUB个人空间Y3q |_-i]!g7E
List<Post> _post =newList<Post>();
$Z/kYsr"d d;H0ITPUB个人空间vF*NxG6yh
publicIQueryable<Post> Posts
+u\_L4PkA7c0{ITPUB个人空间 j-yI uM6H
get{return_post.AsQueryable<Post>(); }
"P&b"c ayY(Qx.p0}ITPUB个人空间{^?A2O7}
}

添加一个ADO.NET Data Service,取名BlogDataService.svc:


%Y ?*K,~2O&]"H0

实现服务,让它继承于泛型的WebDataService,并且设置访问权限。

public classBlogDataService:WebDataService<Blog>ITPUB个人空间WM]4m*q2lK^_.n(LV
{ITPUB个人空间)Xb r#X$q"i!x2g5V~j
public static voidInitializeService(IWebDataServiceConfigurationconfig)ITPUB个人空间V xE+ay|2D x8y
{ITPUB个人空间j8f2T4V\:V4I
config.SetResourceContainerAccessRule("*",ResourceContainerRights.AllRead);
q/t/@f}$j0}
,RtGoi0}

现在我们的服务端就完成了,现在我们可以在浏览器中访问BlogDataService.svc,应该可以看到如下界面:

ITPUB个人空间ts)cH"c"qu(D$w

现在还看不到所有的Posts,我们可以在地址栏中输入http://localhost:8081/BlogDataService.svc/Posts,浏览器会默认为Feed打开,可以查看源代码,将会看到所有内容,XML内容如下(只列出片段):

<?xmlversion="1.0"encoding="utf-8"standalone="yes"?>
&j-I_0J NoF5p0<
feedxml:base="http://localhost:8081/BlogDataService.svc/" ......>
0q-B'L^ _D0bE0<
id>http://localhost:8081/BlogDataService.svc/Posts</id>
{5k:Y S z0U-[0<
updated/>
w#B {)j"d ^0<
title>Posts</title>ITPUB个人空间_Z#c@%e+Mg
<
linkrel="self"href="Posts"title="Posts"/>
:Jm'T2mP$aI u0<
entryadsm:type="TerryLee.SilverlightWithDataServiceDemoWeb.Post">ITPUB个人空间WNAPz'~hW*v
<
id>http://localhost:8081/BlogDataService.svc/Posts(1)</id>
fO-Ch G9E,b0<
updated/>ITPUB个人空间 QV9P#lr
<
title/>ITPUB个人空间Ip dRKN
<
author>
!ME:eTEl0<
name/>
IN2O9i As^Q}?+sf0</
author>
FjR n:^Ta7S#p4b/x0<
linkrel="edit"href="Posts(1)"title="Post"/>ITPUB个人空间)\$\h ow.\.vs?
<
contenttype="application/xml">
g7fdp I0<
ads:Idadsm:type="Int32">1</ads:Id>ITPUB个人空间1Y2eij$h
<
ads:Title>一步一步学Silverlight 2系列(13):数据与通信之WebRequest</ads:Title>ITPUB个人空间?b@n7r-}
<
ads:Author>TerryLee</ads:Author>
2l/P-p.p N [0</
content>ITPUB个人空间CwN{7f&JS#f*z
</
entry>

如果要查看某一条文章的内容,可以输入http://localhost:8081/BlogDataService.svc/Posts(2)进行查看,如下图所示。ITPUB个人空间R2]!~)HI] Q.r tC q

]2C,p9V8V+D wX0

当然还可以进行其他的查询,使用filter和orderby等,如http://localhost:8081/BlogDataService.svc/Posts?$filter=Id eq 1&$orderby=Id,这里不在介绍。至此我们的数据服务端就算完成了。下面再实现客户端,XAML不再贴出来,大家可以参考前面的几篇文章,使用WebClient获取数据,返回的结果是一个XML文件:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
~p] {K$U:W6Y0{
$n%c%M$Ua g m0Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");ITPUB个人空间3~M0H)E*}/j
WebClientclient =newWebClient();
9t'H9}F6])o xt3O0client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);
?y_ _y/|'BWG0client.OpenReadAsync(uri);
XP/Rkn!}{B0}ITPUB个人空间4SvE [#D'L(v
ITPUB个人空间 ~ ?#Fo0e4RqQQ
voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)ITPUB个人空间 ~"bz k$u F
{ITPUB个人空间 ^/s\3j5U;on
if(e.Error ==null)ITPUB个人空间$c7i`bPX
{
Se4t2v&W@^{#?e0
p%aV+V2{%M!mm6s0}
0u)u C2L$w&`qd0}

我们可以使用LINQ to XML进行数据的读取,在Silverlight项目中建立一个Post类,跟上面的Post类一样,然后使用LINQ to XML读取:

XmlReaderreader =XmlReader.Create(e.Result);ITPUB个人空间3X9Yg#Nhh
T!e

i"S#T!GTo8o0XDocumentpostdoc =XDocument.Load(reader);
Q jS$v3{ uN;M0ITPUB个人空间B5@z$Hs6jj.U2b
XNamespacexmlns ="http://www.w3.org/2005/Atom";
(FR+V5eD,t0XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";
q0A3W+I8?n6QGP5[0
(rpbDB2B0varposts =fromxinpostdoc.Descendants(xmlns +"entry")ITPUB个人空间 N e2VPE!Lp
select newPost
2D-@8ej)I1y0
{
9@0c-{I!r(t5J0Id =int.Parse(x.Descendants(ads +"Id").First().Value),
m.[A&B*J A1j0Title = x.Descendants(ads +"Title").First().Value,ITPUB个人空间^$lfz&?2of
Author = x.Descendants(ads +"Author").First().ValueITPUB个人空间 m(o'Z*h)jK
};
w-k X^-T2`0
E"YsZfe-S*r7C0Posts.ItemsSource = posts;

完成的代码如下所示:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
HK#G;q4X!cj6kP0{ITPUB个人空间 u2c.@ \,K_
Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");
h5@8I1Ds2Jr0WebClientclient =newWebClient();ITPUB个人空间 Bd(MY)^b `Y!m
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);
u OO ~b[6nZ|0client.OpenReadAsync(uri);ITPUB个人空间-Ah&b$|Q
}
u z-|.KC?0ITPUB个人空间/m W9h"f} { X3L.z
voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)
uts0V h,z0{
6a r{}4?2IlJ1Nn0if(e.Error ==null)
)e vnux&B0{
T5D)v4q&^N'q:C*tc8e]0XmlReaderreader =XmlReader.Create(e.Result);
)cz{.iAF:Rj0
8k j+co3Y4E~q0XDocumentpostdoc =XDocument.Load(reader);ITPUB个人空间1YH,|m O7x

!vdH/fh0XNamespacexmlns ="http://www.w3.org/2005/Atom";ITPUB个人空间;W?\@5m\
XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";ITPUB个人空间q$E&[7o[)y
ITPUB个人空间4fuM2PM)n"`
varposts =fromxinpostdoc.Descendants(xmlns +"entry")
(nu~.U3fq0select newPost
i4N1?&t N,zrA9_L*~0
{ITPUB个人空间3KeT9|S%L
Id =int.Parse(x.Descendants(ads +"Id").First().Value),ITPUB个人空间&X^j*F0U*RS(D4F8d v
Title = x.Descendants(ads +"Title").First().Value,ITPUB个人空间4b-qG F_(HoR
Author = x.Descendants(ads +"Author").First().Value
m&TE:|#k ]*E;T0};ITPUB个人空间 dZ^+Wo4F W

]7nyvDXBK'd0Posts.ItemsSource = posts;
&Wns5^7j'kd%k0}ITPUB个人空间b)cz(D)L{!zS(e6J9d
}

完整的示例就到这里了,运行后的结果与前面的一样。
z'U1d|Qj+h8p0ITPUB个人空间5R g-eg b ]eJMD

结束语

本文简单介绍了在Silverlight 2调用ADO.NET Data Services,由于对ADO.NET Data Services了解不多,有错误的地方还请大家斧正,你可以从这里下载示例代码。

作者:TerryLee
wCG1`DV0Y&U.c0出处:http://terrylee.cnblogs.com


/q*p"I8n*@0


TAG:

引用 删除 Guest   /   2010-01-07 13:09:31
5
 

评分:0

我来说两句

显示全部

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

Open Toolbar