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

简介:

概述

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

简单示例

如果大家看了前面三篇文章的话,可能对于下面的这个界面已经很烦了,不过在本文我会仍然采用这个示例进行演示:)
 
建立完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.5 Extensions下面,引入命名空间using Microsoft.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<Post>的属性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> _post = new List<Post>();
    public IQueryable<Post> Posts
    {
        get { return _post.AsQueryable<Post>(); }
    }
}
添加一个ADO.NET Data Service,取名BlogDataService.svc:
 
实现服务,让它继承于泛型的WebDataService,并且设置访问权限。
public class BlogDataService : WebDataService<Blog>
{
    public static void InitializeService(IWebDataServiceConfiguration config)
    {
        config.SetResourceContainerAccessRule("*", ResourceContainerRights.AllRead);
    }
}
现在我们的服务端就完成了,现在我们可以在浏览器中访问BlogDataService.svc,应该可以看到如下界面:
 
现在还看不到所有的Posts,我们可以在地址栏中输入 [url]http://localhost:8081/BlogDataService.svc/Posts[/url],浏览器会默认为Feed打开,可以查看源代码,将会看到所有内容,XML内容如下(只列出片段):
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="[url]http://localhost:8081/BlogDataService.svc/[/url]" ......>
  <id>[url]http://localhost:8081/BlogDataService.svc/Posts[/url]</id>
  <updated />
  <title>Posts</title>
  <link rel="self" href="Posts" title="Posts" />
  <entry adsm:type="TerryLee.SilverlightWithDataServiceDemoWeb.Post">
    <id>[url]http://localhost:8081/BlogDataService.svc/Posts[/url](1)</id>
    <updated />
    <title />
    <author>
      <name />
    </author>
    <link rel="edit" href="Posts(1)" title="Post" />
    <content type="application/xml">
      <ads:Id adsm:type="Int32">1</ads:Id>
      <ads:Title>一步一步学Silverlight 2系列(13):数据与通信之WebRequest</ads:Title>
      <ads:Author>TerryLee</ads:Author>
    </content>
  </entry>
如果要查看某一条文章的内容,可以输入 [url]http://localhost:8081/BlogDataService.svc/Posts[/url](2)进行查看,如下图所示。
 
当然还可以进行其他的查询,使用filter和orderby等,如 [url]http://localhost:8081/BlogDataService.svc/Posts?$filter=Id[/url] eq 1&$orderby=Id,这里不在介绍。至此我们的数据服务端就算完成了。下面再实现客户端,XAML不再贴出来,大家可以参考前面的几篇文章,使用WebClient获取数据,返回的结果是一个XML文件:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    Uri uri = new Uri("http://localhost:8081/BlogDataService.svc/Posts");
    WebClient client = new WebClient();
    client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
    client.OpenReadAsync(uri);
}
void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        
    }
}
我们可以使用LINQ to XML进行数据的读取,在Silverlight项目中建立一个Post类,跟上面的Post类一样,然后使用LINQ to XML读取:
XmlReader reader = XmlReader.Create(e.Result);
XDocument postdoc = XDocument.Load(reader);
XNamespace xmlns = "http://www.w3.org/2005/Atom";
XNamespace ads = "http://schemas.microsoft.com/ado/2007/08/dataweb";
var posts = from x in postdoc.Descendants(xmlns + "entry")
            select new Post
            {
                Id = int.Parse(x.Descendants(ads + "Id").First().Value),
                Title = x.Descendants(ads + "Title").First().Value,
                Author = x.Descendants(ads + "Author").First().Value
            };
Posts.ItemsSource = posts;
完成的代码如下所示:
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    Uri uri = new Uri("http://localhost:8081/BlogDataService.svc/Posts");
    WebClient client = new WebClient();
    client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
    client.OpenReadAsync(uri);
}
void client_OpenReadCompleted(object sender,OpenReadCompletedEventArgs e)
{
    if (e.Error == null)
    {
        XmlReader reader = XmlReader.Create(e.Result);
        XDocument postdoc = XDocument.Load(reader);
        XNamespace xmlns = "http://www.w3.org/2005/Atom";
        XNamespace ads = "http://schemas.microsoft.com/ado/2007/08/dataweb";
        var posts = from x in postdoc.Descendants(xmlns + "entry")
                    select new Post
                    {
                        Id = int.Parse(x.Descendants(ads + "Id").First().Value),
                        Title = x.Descendants(ads + "Title").First().Value,
                        Author = x.Descendants(ads + "Author").First().Value
                    };
        Posts.ItemsSource = posts;
    }
}
完整的示例就到这里了,运行后的结果与前面的一样。
 

结束语

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









本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67255 ,如需转载请自行联系原作者









相关文章
|
1月前
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
8 0
|
监控 物联网 API
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
MQTT广泛应用于工业物联网、智能家居、各类智能制造或各类自动化场景等。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,在很多受限的环境下,比如说机器与机器通信、机器与物联网通信等。好了,科普的废话不多说,下面直接通过.NET环境来实现一套MQTT通信demo,实现服务端与客户端的双边消息发布与订阅的功能和演示。
951 0
【.NET+MQTT】.NET6 环境下实现MQTT通信,以及服务端、客户端的双边消息订阅与发布的代码演示
|
1月前
|
SQL 数据库
使用ADO.NET查询和操作数据
使用ADO.NET查询和操作数据
9 0
|
2月前
|
SQL 开发框架 .NET
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
67 0
|
4月前
|
Oracle 关系型数据库 数据管理
.NET医院检验系统LIS源码,使用了oracle数据库,保证数据的隔离和安全性
LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理(采集、传输、处理、输出、发布)、报表管理过程的自动化,使实验室的操作人员和管理者从繁杂的手工劳作中解放出来,提高了检验人员的工作效率和效益,降低了劳动成本和差错发生率。
|
6月前
|
前端开发 JavaScript
.net core 前端传递参数有值 后端接收到的数据却是null
1、问题分析 在做接口测试时,偶然出现了前端输出有值,但是后端断点调试时却出现接收参数总是为null的情况 2、解决办法 前端打印log,看前端的每一个传值的数据类型,与后端请求参数类进行认真的一一比对 小技巧: ① 直接打印调用接口的传参值的数据类型,例如 console.log(type of this.form.name) --string console.log(type of this.form.age) --number 打印的数据类型与后端接口的参数类比对,查出不对应的类型 ② 关于非必填的值,默认传值可能出现空字符串(' ')、NaN值(Not a Number
100 0
|
7月前
|
网络协议 安全 Java
.NET网络编程——TCP通信
.NET网络编程——TCP通信
58 0
|
7月前
|
JSON 数据格式
.NET Core - 配置绑定:使用强类型对象承载配置数据
.NET Core - 配置绑定:使用强类型对象承载配置数据
|
9月前
|
消息中间件 安全 数据库连接
.NET开发问题记录——TransactionScope出错:“与基础事务管理器的通信失败”的解决方法
.NET开发问题记录——TransactionScope出错:“与基础事务管理器的通信失败”的解决方法
183 0
|
9月前
|
数据库 C#
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
218 0