.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个人空间*|0i7`@3X)?

^(I/l\*s_N X0

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

简单示例

如果大家看了前面三篇文章的话,可能对于下面的这个界面已经很烦了,不过在本文我会仍然采用这个示例进行演示:)ITPUB个人空间 t8cA!d_9o4T

4\#_id `)C0

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

public classPost
0?W)c7h-T,w0
{ITPUB个人空间.s)pZ te
public intId {get;set; }ITPUB个人空间6WwFv-?%x
ITPUB个人空间2yAuQ(ZH,T F f
public stringTitle {get;set; }
([7d/uE/G.y9_j&aQk+n0ITPUB个人空间7QA,_.a6GTJ;]h
public stringAuthor {get;set; }ITPUB个人空间 \ } } @0s Vb Tu jH K
}

我们用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
G+m?%i!lS'F0
{ITPUB个人空间 L~fY~3[([k"V!o'|1c
[DataWebKey]ITPUB个人空间,\R S5L*sy \Qw
public intId {get;set; }ITPUB个人空间HJM LFT\
ITPUB个人空间0Q5d$| h9Hg?1f S g
public stringTitle {get;set; }ITPUB个人空间]6p5r$\K&D

#~-g3Q0BD k!zc0public stringAuthor {get;set; }
bM _(h0u"q.M0}

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

public classBlog
4Q4K+] M Nl-K0
{ITPUB个人空间]g(Rb*I)M?Jdc
publicBlog()ITPUB个人空间;Nc+[,`2m~5wE
{
_u*V4z9W} S"V?0_post.Add(newPost{ Id = 1, Title ="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author ="TerryLee"});
T+woe(F)n k B0_post.Add(newPost{ Id = 2, Title ="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author ="TerryLee"});
R\)^ ]:X h z*W` \0_post.Add(newPost{ Id = 3, Title ="一步一步学Silverlight 2系列(11):数据绑定", Author ="TerryLee"});
7mA.v%s?,jT0_post.Add(newPost{ Id = 4, Title ="一步一步学Silverlight 2系列(10):使用用户控件", Author ="TerryLee"});
(ikd)\;S0_post.Add(newPost{ Id = 5, Title ="一步一步学Silverlight 2系列(9):使用控件模板", Author ="TerryLee"});
{$m.Z$xdl(K8nM(O]0_post.Add(newPost{ Id = 6, Title ="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author ="TerryLee"});ITPUB个人空间!W Ned({
}
;iM7Ys;Dg7V0ITPUB个人空间h.a&j;Y V0apl
List<Post> _post =newList<Post>();
K1P[`b3f4f0
$Ax(}O?d~2tM7h0publicIQueryable<Post> PostsITPUB个人空间o{r?3cVC
{
l:TFz v\0get{return_post.AsQueryable<Post>(); }ITPUB个人空间eu#AX8gK,|Nn
}ITPUB个人空间dy"A^+I
}

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

ITPUB个人空间0c/p|](ya(D,w

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

public classBlogDataService:WebDataService<Blog>ITPUB个人空间+iO'Q9U+Ceh7Z*BP
{
6eLb,D^"b8^0public static voidInitializeService(IWebDataServiceConfigurationconfig)
ws"JVM$n6e;h,R g p+P h0{
`b#w3q sC0config.SetResourceContainerAccessRule("*",ResourceContainerRights.AllRead);
)G0__0QSg.}9R0}
's^5kZ cS0}

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

ITPUB个人空间&hti c$c6M

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

<?xmlversion="1.0"encoding="utf-8"standalone="yes"?>ITPUB个人空间|vVYLD(X6x
<
feedxml:base="http://localhost:8081/BlogDataService.svc/" ......>ITPUB个人空间G-c!|6d2K$O'b
<
id>http://localhost:8081/BlogDataService.svc/Posts</id>
o1q6CL$Q%cvh#e0<
updated/>
eJjj lR0<
title>Posts</title>ITPUB个人空间 Om#H*`4aN#x
<
linkrel="self"href="Posts"title="Posts"/>ITPUB个人空间 rv,mg8Y
<
entryadsm:type="TerryLee.SilverlightWithDataServiceDemoWeb.Post">ITPUB个人空间,k@2iF6t;G/Ld z1~WJj
<
id>http://localhost:8081/BlogDataService.svc/Posts(1)</id>
1D Dqzg[:B4g0<
updated/>
_'Hl+]X` T0<
title/>
j@d D/M:}Lok0<
author>
a/| G`-@`Z-Mq0<
name/>ITPUB个人空间 Y NtER OgA;]
</
author>ITPUB个人空间biQ#\fg.z$k1p
<
linkrel="edit"href="Posts(1)"title="Post"/>
XZPW/i0<
contenttype="application/xml">ITPUB个人空间0E&V"Amj@S
<
ads:Idadsm:type="Int32">1</ads:Id>
l"A yzv I*r/w0<
ads:Title>一步一步学Silverlight 2系列(13):数据与通信之WebRequest</ads:Title>
u9y\!Jx&x4T8AKm,PR0<
ads:Author>TerryLee</ads:Author>
&KPS ?h)@0</
content>ITPUB个人空间 xzz$RC
</
entry>

如果要查看某一条文章的内容,可以输入http://localhost:8081/BlogDataService.svc/Posts(2)进行查看,如下图所示。
9m M-_Nb]%P LU&}0ITPUB个人空间L)aAd%S@6q(D

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

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
0h-h'qlH lQs0{ITPUB个人空间2W `jv9|
Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");
l:qPGRGAN0WebClientclient =newWebClient();ITPUB个人空间 }:ISv1V {
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);
\7N:V7\uga0client.OpenReadAsync(uri);ITPUB个人空间!ymp%Yn#`:D)A
}
_I0E%]:f|0o.C0
_6|js/XJ-GvFh0voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)ITPUB个人空间7g@|'o e!`+d4H m
{ITPUB个人空间)A8j$e^v(e n4Qb
if(e.Error ==null)ITPUB个人空间"} dU5sv0c*r
{
+s7i&N)u)\xP|-G%@`0
,{3NA2G rDB \0}
FlH-ehb+A*q SX7{0}

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

XmlReaderreader =XmlReader.Create(e.Result);ITPUB个人空间"q'T\8P1{eX

]Y#j#H So0~:D0XDocumentpostdoc =XDocument.Load(reader);ITPUB个人空间g`7z0T8F-|{

.]wvW3m8sQ K`0XNamespacexmlns ="http://www.w3.org/2005/Atom";
B$A'SxcI7O0XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";ITPUB个人空间~ a0sO/Pv(j%bw

R0Z'Z-n/Gt[5i0varposts =fromxinpostdoc.Descendants(xmlns +"entry")
Jdc#wA0{.P0select newPost
iTfLO0
{
4Iru3G jrW0oF$z0Id =int.Parse(x.Descendants(ads +"Id").First().Value),ITPUB个人空间0G k$|,m x0L
Title = x.Descendants(ads +"Title").First().Value,ITPUB个人空间? M E?&N
Author = x.Descendants(ads +"Author").First().ValueITPUB个人空间.u @XDb/FVp
};
KQ%FIy!h0ITPUB个人空间?4LR)n+V dbLQi
Posts.ItemsSource = posts;

完成的代码如下所示:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间	D(Db[&n
]%i@
{
,H I3tI@K9g'b@ _0Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");ITPUB个人空间 k;[d;n@}t
WebClientclient =newWebClient();ITPUB个人空间|6`TM[5U8A0?\ ~
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);ITPUB个人空间1Q u w!b7s[\IK
client.OpenReadAsync(uri);
:W][/Bh n0}ITPUB个人空间-q5N,v@:B"@-Xm._
ITPUB个人空间*{m O5?5f"|| b
voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)
Q$|L-?%sb [p ]0{
%A A Y3`4{f K z']0if(e.Error ==null)ITPUB个人空间rb}:iTp.H
{
7Y@At;k0|0XmlReaderreader =XmlReader.Create(e.Result);
TrI;@3?8h"|0
3Ddd)QX8h b0XDocumentpostdoc =XDocument.Load(reader);ITPUB个人空间7J:N;dH@ OIG
ITPUB个人空间iCU/UM5R B$xS$p
XNamespacexmlns ="http://www.w3.org/2005/Atom";ITPUB个人空间2cwrXS-v
XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";ITPUB个人空间+]o2VYqx#{
ITPUB个人空间OCZ:D,V,m}0{
varposts =fromxinpostdoc.Descendants(xmlns +"entry")
2vK7c&q%o!xuS4m])woS0select newPost
b Z7D?]*o_.h3Yo0
{
.N}qLF9_!u0Id =int.Parse(x.Descendants(ads +"Id").First().Value),ITPUB个人空间/B%t{k#L&P2Zx
Title = x.Descendants(ads +"Title").First().Value,
,N(h'r-pl9O0Author = x.Descendants(ads +"Author").First().ValueITPUB个人空间*}H]b(n]|
};ITPUB个人空间G&o_A-I7tQ

,k |KG PnkU_6X0Posts.ItemsSource = posts;
}$]+q|K!X0}
u YZ;@%gu4b;})QC0}

完整的示例就到这里了,运行后的结果与前面的一样。ITPUB个人空间r%qX Z#mj`

*e:A"BES rSc0

结束语

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

作者:TerryLee
O*|Ihh0出处:http://terrylee.cnblogs.com

ITPUB个人空间4c1D+g:S)F.bp1V ^


TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-07-07  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

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

RSS订阅

Open Toolbar