.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项:
Ir'ma6M"a0
QG)ex/@K4\x0

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

简单示例

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

/N+Va/n&Y aT0

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

public classPostITPUB个人空间	KL,MW$f`J4]7r&p
{ITPUB个人空间 S^/pR4Q-zt
public intId {get;set; }
\md+Bm_wkV Y0ITPUB个人空间"e)L/i IT
public stringTitle {get;set; }ITPUB个人空间t1h+{:c*K o

h`_4{.f2?"X:?@%|0public stringAuthor {get;set; }
e x*A+@'u%qFM5c|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
9e Y&R8kb2x'A0
{
9w:PAe/D%j0[DataWebKey]ITPUB个人空间7U+b#W} fOQ+z9{B
public intId {get;set; }ITPUB个人空间;V;G/N.FS9G&f
ITPUB个人空间9?W KB3rE/S;v
public stringTitle {get;set; }
0Qa,dXaP*?0ITPUB个人空间P(Wi I qMP\!bA
public stringAuthor {get;set; }
0}t'L/y2Z Z*H-`&n0}

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

public classBlog
2nN1uB P^*`t0
{
B^v:{%a3t@ f0publicBlog()ITPUB个人空间8j jnJ];jZa+CV
{
:^D0v2t ]0_post.Add(newPost{ Id = 1, Title ="一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author ="TerryLee"});
\7q/Z_?~2F0_post.Add(newPost{ Id = 2, Title ="一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author ="TerryLee"});ITPUB个人空间pNg;D1t@H
_post.Add(newPost{ Id = 3, Title ="一步一步学Silverlight 2系列(11):数据绑定", Author ="TerryLee"});
$hB IW.KD:m0_post.Add(newPost{ Id = 4, Title ="一步一步学Silverlight 2系列(10):使用用户控件", Author ="TerryLee"});ITPUB个人空间 jN&N9iZK_VBB
_post.Add(newPost{ Id = 5, Title ="一步一步学Silverlight 2系列(9):使用控件模板", Author ="TerryLee"});
[kk/[n&Ck5W0_post.Add(newPost{ Id = 6, Title ="一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author ="TerryLee"});
4c+|2v:D/aM*?-H0}
6oh:s.W S*m0ITPUB个人空间%XOE5F%N#@t$L%Z
List<Post> _post =newList<Post>();
s |5B\zk0
:uCl$cV h0publicIQueryable<Post> PostsITPUB个人空间'[%Z_^W"vu
{
?}7l ])jng0get{return_post.AsQueryable<Post>(); }ITPUB个人空间OS8P yseTVD
}
W0v)|F$e-?jn0}

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

ITPUB个人空间 @\C V?#w~R

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

public classBlogDataService:WebDataService<Blog>
:HBDr*l|"Y;d6I'J0{
4BcY k3mrrS0public static voidInitializeService(IWebDataServiceConfigurationconfig)
6q3l#UcZ8P0{ITPUB个人空间*\[0FD'_
config.SetResourceContainerAccessRule("*",ResourceContainerRights.AllRead);ITPUB个人空间-csq(k2|.NW6w M
}
+SIKS O/D0}

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

ITPUB个人空间Z3VXR#s:g

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

<?xmlversion="1.0"encoding="utf-8"standalone="yes"?>ITPUB个人空间g%s5iHk#G3eX4i
[
<
feedxml:base="http://localhost:8081/BlogDataService.svc/" ......>ITPUB个人空间UA2DA)kl`/p
<
id>http://localhost:8081/BlogDataService.svc/Posts</id>
0c h*H:e^0<
updated/>ITPUB个人空间j$vu#oH1g%qwI
<
title>Posts</title>ITPUB个人空间{BU"So%Mm
<
linkrel="self"href="Posts"title="Posts"/>
1IVn0k1DWJw0<
entryadsm:type="TerryLee.SilverlightWithDataServiceDemoWeb.Post">ITPUB个人空间9O-`h \/G"O%_5i&uh
<
id>http://localhost:8081/BlogDataService.svc/Posts(1)</id>ITPUB个人空间3P@7B8R6z'k%] C
<
updated/>
2m1{G(M*Qm6@0<
title/>ITPUB个人空间W_F+o'?{J"H
<
author>ITPUB个人空间QaT M|xir1?*j
<
name/>
"m;G%n,o:`9~0</
author>
-?kGJs"@9PW.O0<
linkrel="edit"href="Posts(1)"title="Post"/>ITPUB个人空间Khm$AYW7I
<
contenttype="application/xml">ITPUB个人空间s(Yz#C3IO.qEN5}
<
ads:Idadsm:type="Int32">1</ads:Id>ITPUB个人空间x2|.{BT Ul A
<
ads:Title>一步一步学Silverlight 2系列(13):数据与通信之WebRequest</ads:Title>
_.`XvlB7v(Z0<
ads:Author>TerryLee</ads:Author>ITPUB个人空间:Cs4Zu5h1O]Ja a
</
content>ITPUB个人空间-W+NO)@ c
</
entry>

如果要查看某一条文章的内容,可以输入http://localhost:8081/BlogDataService.svc/Posts(2)进行查看,如下图所示。
@8pO5VGT3nt0
1|&]0Z2^Dd0

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

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
0h5`I)V6p#g f(E;L~h0{
,?;i#})x-{&}c0Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");ITPUB个人空间jP.m&w+hJ
WebClientclient =newWebClient();ITPUB个人空间:f ZF.x,e[ S0DPZ!a
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);
i;?to#Yd1W0client.OpenReadAsync(uri);
:R2X"RO-c0p]4d&h0}ITPUB个人空间:Q!Rwu0K,p

_0w t'oV U0voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)
7V0EKeV+[H0{
){+ox@5I4C+Y*d&yO/o+r0if(e.Error ==null)
C$~Z.U6U1N*GK0{ITPUB个人空间qw#NcQ
ITPUB个人空间*?2a%T)B+_ G
}ITPUB个人空间"g:Iw4R#n-sitmT!B&b
}

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

XmlReaderreader =XmlReader.Create(e.Result);
WR.GL3Zc%`+Fpi0
6DR_Jk?*cJ/P0XDocumentpostdoc =XDocument.Load(reader);ITPUB个人空间k(p*Go7g

:wZ_/~0_*_S0XNamespacexmlns ="http://www.w3.org/2005/Atom";ITPUB个人空间#K'mC:XV&J s
XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";ITPUB个人空间&a!qK Uy2Nrsh

6G7FS{3Is0varposts =fromxinpostdoc.Descendants(xmlns +"entry")ITPUB个人空间1n8}w2Y w.dYYo
select newPostITPUB个人空间)]6y6Y!_oJ
{
Tv)_S'W1| V']'Y\0Id =int.Parse(x.Descendants(ads +"Id").First().Value),
&A1a^)D_n/d~0Title = x.Descendants(ads +"Title").First().Value,
5QtpNwM_0Author = x.Descendants(ads +"Author").First().Value
^zrmob0};
+MF)W,GiL0ITPUB个人空间-Ie {7N]}tF%|6i
Posts.ItemsSource = posts;

完成的代码如下所示:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
M8l |[3K)]$uA1^0{
V?QD R\0Uriuri =newUri("http://localhost:8081/BlogDataService.svc/Posts");
&c/Vu ?d-V _d+gO0WebClientclient =newWebClient();ITPUB个人空间n&WE d,D
client.OpenReadCompleted +=newOpenReadCompletedEventHandler(client_OpenReadCompleted);
0Pz+D;C2VY0client.OpenReadAsync(uri);ITPUB个人空间^c0H.[d%P
}ITPUB个人空间s(TI\I:WG F.j:d
ITPUB个人空间)fR8iU^ O0OY
voidclient_OpenReadCompleted(objectsender,OpenReadCompletedEventArgse)
u~0K-P3G`0{
2Eh1B2ua O:{3d0if(e.Error ==null)ITPUB个人空间:` XOc3bP%u
{ITPUB个人空间(UZv(fy t
XmlReaderreader =XmlReader.Create(e.Result);ITPUB个人空间fq.^?_7uE,Q^rJ
ITPUB个人空间F5Q$z A0`$v Z
XDocumentpostdoc =XDocument.Load(reader);ITPUB个人空间'F:I`'^:ab$`
ITPUB个人空间C ~ x8T(i B
XNamespacexmlns ="http://www.w3.org/2005/Atom";
"?JE&zy9o0XNamespaceads ="http://schemas.microsoft.com/ado/2007/08/dataweb";ITPUB个人空间;M'P s#xLq

YHElD!W0varposts =fromxinpostdoc.Descendants(xmlns +"entry")
"_z%X%pD0CA;g0select newPostITPUB个人空间#J)t-w)g;hFBca2{q
{ITPUB个人空间 S5} e:f:v8E
Id =int.Parse(x.Descendants(ads +"Id").First().Value),ITPUB个人空间R$F'i |+G(n {6fjy1z
Title = x.Descendants(ads +"Title").First().Value,
:IR.d;B;dqXL0Author = x.Descendants(ads +"Author").First().ValueITPUB个人空间r/jf%r_:_,C
};ITPUB个人空间6M~&R5Yr&h'_

F?vz;M0Posts.ItemsSource = posts;
OxMF+wQ-t?.O?0}
EqNT D6tN0}

完整的示例就到这里了,运行后的结果与前面的一样。ITPUB个人空间1I0J;_1b%J cR @6W:D'L
ITPUB个人空间+sZ$D3z'SF

结束语

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

作者:TerryLeeITPUB个人空间'o/Z:v[+T-J9IB-` e
出处:http://terrylee.cnblogs.com

ITPUB个人空间.w+l Oj!Q}$r"_:H-dg }


TAG:

 

评分:0

我来说两句

显示全部

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

Open Toolbar