学Silverlight 2系列(17):数据与通信之ADO.NET Data Services

来源:百度文库 编辑:神马文学网 时间:2024/04/29 14:39:45
一步一步学Silverlight 2系列(17):数据与通信之ADO.NET Data Services
概述
Silverlight2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, VisualC#, IronRuby, Ironpython,对JSON、WebService、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入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项:

ADO.NETDataService允许应用程序把数据以服务的形式公开,这样我们就可以通过浏览器来直接访问数据,它支持开放的业界标准,如AtomPub和JSON。它支持标准的HTTP动作如POST、GET、PUT、DELETE,用来完成数据的创建、更新、删除和读取。ADO.NET DataService的知识这里不再多说,大家可以去查看相关的资料。
简单示例
如果大家看了前面三篇文章的话,可能对于下面的这个界面已经很烦了,不过在本文我会仍然采用这个示例进行演示:)

建立完Silverlight 2项目之后,我们在Web项目中添加一个Post类:
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
我们用Id作为Post的主键,这里需要添加对于Microsoft.Data.Web.dll程序集的引用,位于<盘符>Program Files\Reference Assemblies\Microsoft\Framework\ASP.NET 3.5Extensions下面,引入命名空间usingMicrosoft.Data.Web,并且为Id加上[DataWebKey]特性,最终完成后代码应该如下:
public class Post
{
[DataWebKey]
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
再添加一个Blog类,它有一个返回类型为IQueryable的属性Posts:
public class Blog
{
public Blog()
{
_post.Add(new Post { Id = 1, Title = "一步一步学Silverlight 2系列(13):数据与通信之WebRequest", Author = "TerryLee" });
_post.Add(new Post { Id = 2, Title = "一步一步学Silverlight 2系列(12):数据与通信之WebClient", Author = "TerryLee" });
_post.Add(new Post { Id = 3, Title = "一步一步学Silverlight 2系列(11):数据绑定", Author = "TerryLee" });
_post.Add(new Post { Id = 4, Title = "一步一步学Silverlight 2系列(10):使用用户控件", Author = "TerryLee" });
_post.Add(new Post { Id = 5, Title = "一步一步学Silverlight 2系列(9):使用控件模板", Author = "TerryLee" });
_post.Add(new Post { Id = 6, Title = "一步一步学Silverlight 2系列(8):使用样式封装控件观感", Author = "TerryLee" });
}
List _post = new List();
public IQueryable Posts
{
get { return _post.AsQueryable(); }
}
}
添加一个ADO.NET Data Service,取名BlogDataService.svc:

实现服务,让它继承于泛型的WebDataService,并且设置访问权限。
public class BlogDataService : WebDataService
{
public static void InitializeService(IWebDataServiceConfiguration config)
{
config.SetResourceContainerAccessRule("*", ResourceContainerRights.AllRead);
}
}
现在我们的服务端就完成了,现在我们可以在浏览器中访问BlogDataService.svc,应该可以看到如下界面:

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


http://localhost:8081/BlogDataService.svc/Posts

Posts


http://localhost:8081/BlogDataService.svc/Posts(1)

<br><author><br><name /><br></author><br><link rel="edit" href="Posts(1)" title="Post" /><br><content type="application/xml"><br><ads:Id adsm:type="Int32">1</ads:Id><br><ads:Title>一步一步学Silverlight 2系列(13):数据与通信之WebRequest</ads:Title><br><ads:Author>TerryLee</ads:Author><br></content><br></entry><br>如果要查看某一条文章的内容,可以输入http://localhost:8081/BlogDataService.svc/Posts(2)进行查看,如下图所示。<br><img style='max-width:300px;' id="img4" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight217ADO.NETDataServices_E7B0/TerryLee_Silverlight2_0079_thumb.png" /><br>当然还可以进行其他的查询,使用filter和orderby等,如http://localhost:8081/BlogDataService.svc/Posts?$filter=Id eq 1&$orderby=Id,这里不在介绍。至此我们的数据服务端就算完成了。下面再实现客户端,XAML不再贴出来,大家可以参考前面的几篇文章,使用WebClient获取数据,返回的结果是一个XML文件:<br>private void UserControl_Loaded(object sender, RoutedEventArgs e)<br>{<br>Uri uri = new Uri("http://localhost:8081/BlogDataService.svc/Posts");<br>WebClient client = new WebClient();<br>client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);<br>client.OpenReadAsync(uri);<br>}<br>void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)<br>{<br>if (e.Error == null)<br>{<br>}<br>}<br>我们可以使用LINQ to XML进行数据的读取,在Silverlight项目中建立一个Post类,跟上面的Post类一样,然后使用LINQ to XML读取:<br>XmlReader reader = XmlReader.Create(e.Result);<br>XDocument postdoc = XDocument.Load(reader);<br>XNamespace xmlns = "http://www.w3.org/2005/Atom";<br>XNamespace ads = "http://schemas.microsoft.com/ado/2007/08/dataweb";<br>var posts = from x in postdoc.Descendants(xmlns + "entry")<br>select new Post<br>{<br>Id = int.Parse(x.Descendants(ads + "Id").First().Value),<br>Title = x.Descendants(ads + "Title").First().Value,<br>Author = x.Descendants(ads + "Author").First().Value<br>};<br>Posts.ItemsSource = posts;<br>完成的代码如下所示:<br>private void UserControl_Loaded(object sender, RoutedEventArgs e)<br>{<br>Uri uri = new Uri("http://localhost:8081/BlogDataService.svc/Posts");<br>WebClient client = new WebClient();<br>client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);<br>client.OpenReadAsync(uri);<br>}<br>void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)<br>{<br>if (e.Error == null)<br>{<br>XmlReader reader = XmlReader.Create(e.Result);<br>XDocument postdoc = XDocument.Load(reader);<br>XNamespace xmlns = "http://www.w3.org/2005/Atom";<br>XNamespace ads = "http://schemas.microsoft.com/ado/2007/08/dataweb";<br>var posts = from x in postdoc.Descendants(xmlns + "entry")<br>select new Post<br>{<br>Id = int.Parse(x.Descendants(ads + "Id").First().Value),<br>Title = x.Descendants(ads + "Title").First().Value,<br>Author = x.Descendants(ads + "Author").First().Value<br>};<br>Posts.ItemsSource = posts;<br>}<br>}<br>完整的示例就到这里了,运行后的结果与前面的一样。<br><img style='max-width:300px;' id="img5" src="http://www.cnblogs.com/images/cnblogs_com/Terrylee/WindowsLiveWriter/Silverlight217ADO.NETDataServices_E7B0/TerryLee_Silverlight2_0065_thumb.gif" /><br>结束语<br>本文简单介绍了在Silverlight 2调用ADO.NET Data Services,由于对ADO.NET Data Services了解不多,有错误的地方还请大家斧正,你可以从这里下载示例代码。</div> <div class="list-group"> <a href="/article/1263322" class="list-group-item">学Silverlight 2系列(17):数据与通信之ADO.NET Data Services</a> <a href="/article/1263313" class="list-group-item">Silverlight 2系列(14):数据与通信之WCF</a> <a href="/article/1263305" class="list-group-item">学Silverlight 2系列(11):数据绑定</a> <a href="/article/1263310" class="list-group-item">Silverlight 2系列(11):数据绑定</a> <a href="/article/261263" class="list-group-item">一步一步学Silverlight 2系列(1):创建一个基本的Silverlight应用</a> <a href="/article/251088" class="list-group-item">一步一步学Silverlight 2系列(10):使用用户控件</a> <a href="/article/1896054" class="list-group-item">.Net Framework 数据提供程序要求 Microsoft Data Access...</a> <a href="/article/35919" class="list-group-item">Java与.NET 的Web Services相互调用</a> <a href="/article/869448" class="list-group-item">Java与.NET 的Web Services相互调用</a> <a href="/article/1181205" class="list-group-item">ADO数据访问模型初学者入门(转)</a> <a href="/article/100680" class="list-group-item">SOA Web Services - Data Access Service</a> <a href="/article/25575" class="list-group-item">使用ADO.NET访问数据库</a> <a href="/article/479615" class="list-group-item">ADO.net学习记录 (一)</a> <a href="/article/2182277" class="list-group-item">Data informed, not data driven(数据启示,而非驱动) --Facebook</a> <a href="/article/306111" class="list-group-item">BBS 数据挖掘研究及其地位与核心问题 - 数据挖掘研究院( China Data Min...</a> <a href="/article/2851608" class="list-group-item">Silverlight 2.0 系列文章索引</a> <a href="/article/1843550" class="list-group-item">一步一步学Data Guard之基础篇-入门基础</a> <a href="/article/398951" class="list-group-item">silverlight教程(2)--布局管理器</a> <a href="/article/73346" class="list-group-item">Java 与 .NET 的基于 WS-Security的Web Services集成实现</a> <a href="/article/73349" class="list-group-item">Java与.NET开发的Web Services相互调用的技术。</a> <a href="/article/35375" class="list-group-item">ADO.NET 的最佳实践技巧</a> <a href="/article/237962" class="list-group-item">ADO.NET 的最佳实践技巧</a> <a href="/article/1598856" class="list-group-item">ADO.net学习记录 (一) - 综合应用</a> <a href="/article/2110848" class="list-group-item">Silverlight实例教程 - Validation数据验证开篇</a> </div> </div> </div> </div> </div> </div> <footer id="footer" class="footer hidden-print"> <div class="container"> <div class="panel panel-default"> <div class="panel-heading">相关问题</div> <div class="panel-body"> <a class="btn btn-default" href="/article/2210669" title="奥运瓷·中国红-上001">奥运瓷·中国红-上001</a> <a class="btn btn-default" href="/article/2210670" title="国学经典与教育读本(一)">国学经典与教育读本(一)</a> <a class="btn btn-default" href="/article/2210671" title="《东方时代环球时事解读.时事节简版》 星期五 10年10月08日">《东方时代环球时事解读.时事节简版》 星期五 10年10月08日</a> <a class="btn btn-default" href="/article/2210672" title="崩溃!10大最可怕的食物">崩溃!10大最可怕的食物</a> <a class="btn btn-default" href="/article/2210673" title="肖传国出巨资自毁“英名”实在可惜">肖传国出巨资自毁“英名”实在可惜</a> <a class="btn btn-default" href="/article/2210674" title="中国古代">中国古代</a> <a class="btn btn-default" href="/article/2210675" title="晓风残章,碎了的风月">晓风残章,碎了的风月</a> <a class="btn btn-default" href="/article/2210676" title="中国房地产界十大忽悠(十)">中国房地产界十大忽悠(十)</a> <a class="btn btn-default" href="/article/2210677" title="简易披萨*菠萝蛋奶露">简易披萨*菠萝蛋奶露</a> <a class="btn btn-default" href="/article/2210678" title="25岁以下男人必读 (经典)(转载)">25岁以下男人必读 (经典)(转载)</a> <a class="btn btn-default" href="/article/2210679" title="股票财经书籍在线阅读">股票财经书籍在线阅读</a> <a class="btn btn-default" href="/article/2210680" title="值得收藏的药方2">值得收藏的药方2</a> <a class="btn btn-default" href="/article/2210681" title="在考验中成长">在考验中成长</a> <a class="btn btn-default" href="/article/2210682" title="让IE主页永远不被篡改">让IE主页永远不被篡改</a> <a class="btn btn-default" href="/article/2210683" title="出虚汗是什么原因?虚汗的常识">出虚汗是什么原因?虚汗的常识</a> <a class="btn btn-default" href="/article/2210684" title="男人最“致命”的秘密1">男人最“致命”的秘密1</a> <a class="btn btn-default" href="/article/2210685" title="秋色赋【峻青】">秋色赋【峻青】</a> <a class="btn btn-default" href="/article/2210686" title="直肠癌治疗措施">直肠癌治疗措施</a> <a class="btn btn-default" href="/article/2210687" title="教师职业道德修养的思考">教师职业道德修养的思考</a> <a class="btn btn-default" href="/article/2210688" title="古代绘画精品高清大图【72P】">古代绘画精品高清大图【72P】</a> <a class="btn btn-default" href="/article/2210689" title="[转载]气虚体质养生法">[转载]气虚体质养生法</a> <a class="btn btn-default" href="/article/2210690" title="当好副职的十条诤言">当好副职的十条诤言</a> <a class="btn btn-default" href="/article/2210691" title="咳嗽治疗的51个偏方 敬请留存 以备之需">咳嗽治疗的51个偏方 敬请留存 以备之需</a> <a class="btn btn-default" href="/article/2210692" title="7个偷情故事【特搞笑】">7个偷情故事【特搞笑】</a> <a class="btn btn-default" href="/article/2210693" title="“压力山大”">“压力山大”</a> <a class="btn btn-default" href="/article/2210694" title="男的想女的,女的想男的,那就叫漏。">男的想女的,女的想男的,那就叫漏。</a> <a class="btn btn-default" href="/article/2210695" title="苏双碧:学术领域的可喜成果—读胡绳新著《从鸦片战争到五四运动》">苏双碧:学术领域的可喜成果—读胡绳新著《从鸦片战争到五四运动》</a> <a class="btn btn-default" href="/article/2210696" title="在线计算器大全">在线计算器大全</a> <a class="btn btn-default" href="/article/2210697" title="[转载]平和体质养生法">[转载]平和体质养生法</a> <a class="btn btn-default" href="/article/2210698" title="一路走来">一路走来</a> <a class="btn btn-default" href="/article/2210699" title="校准、溯源性和标准">校准、溯源性和标准</a> </div> </div></div> <div class="copy-right"> <p>神马文学网,客观、专业、权威的知识性互动百科全书。</p></div> </footer> </body> </html>