.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项:
d-o u.{ g0
\Gr_tz"z0

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

简单示例

如果大家看了前面三篇文章的话,可能对于下面的这个界面已经很烦了,不过在本文我会仍然采用这个示例进行演示:)ITPUB个人空间N Bz4?9|K ~L F
ITPUB个人空间6s#k6C-\\&t d

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

public classPostITPUB个人空间n'H4xYAl^8m
{ITPUB个人空间wQ(m4Q3an Pa3^ J
public intId {get;set; }ITPUB个人空间.?h/lL_3V-Y+U'c

v"B1M{%QH0public stringTitle {get;set; }
O.GlJ'}8R0ITPUB个人空间"Z-G1RM#YoXZ%~
public stringAuthor {get;set; }
+?4~ [+s;FOM2`0}

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

public classPost
{ s ig4U+Nl n0
{
P6W#m*W(s,S`W:Q0[DataWebKey]ITPUB个人空间 F/T` }(Ca7SG
public intId {get;set; }ITPUB个人空间-m }R.Yp+R%w

'A~-|E)q8tp0public stringTitle {get;set; }ITPUB个人空间2Ck,x3Y/u

Dp/^ D-Q0public stringAuthor {get;set; }ITPUB个人空间 T O!lV[:R0QSE
}

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

public classBlog
:J+qTN3D ^0
{
J*~&qY5b;v6F#S0publicBlog()
2O \ VyN)x0{ITPUB个人空间8B\(N)EyfXB K
_post.Add(newPost{ Id = 1, Title ="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author ="TerryLee"});
xqq UJ_W8C0_post.Add(newPost{ Id = 2, Title ="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author ="TerryLee"});
tr-N r0`jep~0_post.Add(newPost{ Id = 3, Title ="一步一步学Silverlight 2系列(11):数据绑定", Author ="TerryLee"});
0s q%E v2u;j0_post.Add(newPost{ Id = 4, Title ="一步一步学Silverlight 2系列(10):使用用户控件", Author ="TerryLee"});ITPUB个人空间 dA9yWf
_post.Add(newPost{ Id = 5, Title ="一步一步学Silverlight 2系列(9):使用控件模板", Author ="TerryLee"});ITPUB个人空间aBwl8d7wgn
_post.Add(newPost{ Id = 6, Title ="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author ="TerryLee"});
!x0?k BQvr7BnE4_0}ITPUB个人空间QjQr"G Jz A+gu
ITPUB个人空间#B/B8n$\Z*@$@
List<Post> _post =newList<Post>();
KpnZEx1t@ _0ITPUB个人空间sKwt)@DS6I6A_
publicIQueryable<Post> PostsITPUB个人空间\0t+gG*~:~L"^$w|J;GA
{
bS$Z+\&J!O0get{return_post.AsQueryable<Post>(); }
-s3F9@2GO{ T0}
B@O ?g\j0}

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

ITPUB个人空间3}%Kj+L fu)]AO5f{6@

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

public classBlogDataService:WebDataService<Blog>
EHi}"L e0{
*W5G n5{:O-s*| h+Xz0public static voidInitializeService(IWebDataServiceConfigurationconfig)ITPUB个人空间Cz3~cnJ
{ITPUB个人空间ki-a*hna!a U b
config.SetResourceContainerAccessRule("*",ResourceContainerRights.AllRead);ITPUB个人空间*\%hI^"U!z+[*n`3oN(^{*c
}
0]2w x*t'O0}

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

ITPUB个人空间-k r.Y0XIm7X

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

<?xmlversion="1.0"encoding="utf-8"standalone="yes"?>ITPUB个人空间#y$g%a,s{F
<
feedxml:base="http://localhost:8081/BlogDataService.svc/" ......>ITPUB个人空间-z \+`n*}aFh
<
id>http://localhost:8081/BlogDataService.svc/Posts</id>
7Ab;jk+X`bc4o0<
updated/>ITPUB个人空间]+GpUR0O
<
title>Posts</title>ITPUB个人空间GCx:]i.V2\W
<
linkrel="self"href="Posts"title="Posts"/>
5ilg:QJF r0<
entryadsm:type="TerryLee.SilverlightWithDataServiceDemoWeb.Post">ITPUB个人空间yiu ^Lj6Jc/p8fc2s
<
id>http://localhost:8081/BlogDataService.svc/Posts(1)</id>
,|T P#rr3?0j0<
updated/>ITPUB个人空间B$a9F"O2i;b!Ca1m
<
title/>ITPUB个人空间_&q#BP}*Bmm|v U
<
author>
F zT` y&^/Y0<
name/>ITPUB个人空间Bo Z f/w*Q-_9E
</
author>ITPUB个人空间%qH@_xCo3l-ea
<
linkrel="edit"href="Posts(1)"title="Post"/>ITPUB个人空间 eVv#K ~L1p4J/Mw1qes
<
contenttype="application/xml">ITPUB个人空间4l.Fl{5b#O
<
ads:Idadsm:type="Int32">1</ads:Id>ITPUB个人空间2U8oTZG \
<
ads:Title>一步一步学Silverlight 2系列(13):数据与通信之WebRequest</ads:Title>
Q:IH| sT {,y0<
ads:Author>TerryLee</ads:Author>
2ntxXD0</
content>
\X8UP4GF Pi}0</
entry>

如果要查看某一条文章的内容,可以输入http://localhost:8081/BlogDataService.svc/Posts(2)进行查看,如下图所示。
8osn;A!i)Cz;J"w0ITPUB个人空间&Q@)aU&x4NY b

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

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
)L``^I5lr0{ITPUB个人空间n;fg5aL
Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");
w@ V8J f.W;t0WebClientclient =newWebClient();ITPUB个人空间G0Tv*r$?8B(~
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);ITPUB个人空间y's*T'l%\,o
client.OpenReadAsync(uri);ITPUB个人空间 `j!iU*i]#KRWX
}ITPUB个人空间` O.~iWpZ:]T:|j+~

-y5q.|XBHON0voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)
O hR*g0bx P6P0{
R5Czlkp*m,b8y0if(e.Error ==null)
3x2Qv2PkGV0{ITPUB个人空间UgFNRv@8O?

y?6@8P2@ Q4p0}
Z"a)}j |+\e@%Y0}

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

XmlReaderreader =XmlReader.Create(e.Result);ITPUB个人空间Hk2sPibZ%@
ITPUB个人空间OG,G @V"SXU)u
XDocumentpostdoc =XDocument.Load(reader);ITPUB个人空间)Y0{)r q;|^p4P

F Q OqCl0XNamespacexmlns ="http://www.w3.org/2005/Atom";ITPUB个人空间~&R0W2k5] Y7]
XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";
x%tL%` x;nvl;P0AE0ITPUB个人空间`1jRuI1{W
varposts =fromxinpostdoc.Descendants(xmlns +"entry")
I9J z7Z,G*n,WT0select newPostITPUB个人空间E:C-\7P d F
{
;B.xS ~,e6f:HD0Id =int.Parse(x.Descendants(ads +"Id").First().Value),ITPUB个人空间9QL n,}6rTv#Z
Title = x.Descendants(ads +"Title").First().Value,
'Gsg^U0Author = x.Descendants(ads +"Author").First().Value
r y;Mh${0};ITPUB个人空间vc?aV(G~;J2Jh@:d\

BVp w^D0Posts.ItemsSource = posts;

完成的代码如下所示:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
2}B;X7hg&e0{
;a0x4Y-p9C'}+d0Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");
H:t(v-\8?f!l/W"_0WebClientclient =newWebClient();ITPUB个人空间 q*M.W2S!I
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);
{#Q[V@Yu0client.OpenReadAsync(uri);
&l1kU[5F@aT'D0}ITPUB个人空间 i Xd4~9l
ITPUB个人空间 i5B(D ddc.ww)Y W
voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)ITPUB个人空间9tk/?C*g \
{ITPUB个人空间ro4qG:X
if(e.Error ==null)ITPUB个人空间3y`Xd5H7u$zh
{ITPUB个人空间Z\6LTy
XmlReaderreader =XmlReader.Create(e.Result);ITPUB个人空间.t3D3fSj2s"OA
ITPUB个人空间3e1^l-_[4q
XDocumentpostdoc =XDocument.Load(reader);
L'@W AX0ITPUB个人空间1uMfG,` g;aI L9y
XNamespacexmlns ="http://www.w3.org/2005/Atom";
*m$v7q^ lf(b1cr E0XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";
7nW l2Z n5qO0ITPUB个人空间2V nU'{V2Uw
varposts =fromxinpostdoc.Descendants(xmlns +"entry")ITPUB个人空间;b AP#ZDWm6I"f
select newPost
VW7@0O7Gq0
{ITPUB个人空间i#q{&s"Mhoj#x
Id =int.Parse(x.Descendants(ads +"Id").First().Value),
eG%Kd Z~-SS(Z0Title = x.Descendants(ads +"Title").First().Value,
;T;k_m,D0Author = x.Descendants(ads +"Author").First().ValueITPUB个人空间j#^ u qH(~Ah
};
t EtLU:?-GI UR-B"_0
3a7S)ul3p4o+Z0Posts.ItemsSource = posts;ITPUB个人空间uE(I%~7LY ndh
}
3[xuS+Y0}

完整的示例就到这里了,运行后的结果与前面的一样。ITPUB个人空间u'iW3_Oz

7\+@Ot8ZN`0

结束语

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

作者:TerryLeeITPUB个人空间r'AIF/~DM
出处:http://terrylee.cnblogs.com


M VT8xI Fd0


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 :( :)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665817
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar