这是
Silverlight入门
系列的第三部分。点击
这里可以查看本系列的目录。
现在我们已经有了一个基础布局,同时也在上面放了一些
控件,接下来让我们开始获取数据。因为我们想要
搜索Twitter上的内容,所以我们需要充分使用他们提供的Web服务
API。在继续之前,我要先说明在本次的应用程序中,我们不会自己建立一个数据库或其它数据源,但是我要指出的是你有很多种方式可以通过 Silverlight访问数据。
数据访问选项
对于在Silverlight中访问数据,初学者的误解之一就是他们在Silverlight中寻找ADO.NET类库。别找了,找不到的。记住,Silverlight是部署在互联网上的客户端技术,你不能要求一个浏览器
插件去直接访问你的数据库……除非你想把数据库直接暴露在网络上。我们都知道绝对不能这么做。
所以比较可行的方法是在服务层上暴露数据。这也是Silverlight进行数据通信的方式。这里有一些主要的访问手段:
* Web服务: SOAP, ASP.NET web services (ASMX), WCF services, POX, REST 终端
* 套接字: 网络套接字通信(Network Socket Communication)
* 文件: 通过Web请求访问静态内容
套接字
套接字可能是最先进的数据访问终端。你需要有一个套接字主机,并且在我写这篇文章的时候,还需要通过指定的端口范围通信。如果这些你都可以接受,那么这是非常有效且强大的数据访问方式。但如果你的应用程序是公开面向网络的,那么我并不认为这种方式可以成为主流。就我的观点,这种方式更加通常被用于商业应用。这里有一些套接字的资料:
*
软件开发工具包(SDK)文档
*
通过套接字访问数据 (Dan Wahlin, MVP) – 这是Silverlight2的资料,但不会影响你理解概念
在决定使用它之前,你必须先真正理解你的部署方案,不要盲目地使用它。
文件访问
Silverlight可以与本地文件或网络文件进行交互。对于访问本地文件,虽然应用程序无法直接访问文件系统,但是仍然可以通过OpenFileDialog和SaveFileDialog来让用户自己保存数据流到本地,从而进行读写操作。
此外,你还可以通过Silverlight使用标准HTTP命令来读写网上的纯文本文件以及XML文件信息。下面是使用这些方法的一些辅助资料。
*
打开文件对话框与文件上传
*
保存文件对话框
你可能发现自己正是用这种方式来保存程序设置数据或者进行简单的数据访问的。
Web服务(Web Services)
这是Silverlight访问数据的核心——通过服务层。Silverlight支持在VS中使用我们熟悉的添加服务引用的方式来访问基础ASP.NET Web Services(ASMX)或者基于WCF的服务,并且还将会为你生成强类型的代理代码。
另外,你还可以通过标准HTTP协议访问POX(Plain old XML)或基于REST的终端。理解这些不同服务类型的应用场合,通常是开发人员学会了解自己的项目最适合什么数据访问方式的最佳途径。这里有一些资料:
*
使用WCF和ASP.NET Web服务
*
通过HTTPS调用服务
*
.NET RIA 服务
*
选择数据访问层 (Shawn Wildermuth,微软最有价值专家)
上面的第三项.NET RIA服务是一个新的
框架,旨在使数据访问更加简单方便。链接的
视频将会为你介绍那个主题。如果你有一个与你的Silverlight应用程序放在一起的数据库,那么如果想要让这个数据库为你的Silverlight应用程序服务的话,.NET RIA服务是最好的方法。
异步访问
所有在Silverlight中进行的数据访问都是异步的。这可能是专门从事Web开发的开发人员跃跃欲试的另一个领域。比如在服务器端,这样的写法看起来可能很合理:
- 1 MyWebService svc = new MyWebService();
- 2 string foo = svc.GetSomeValue();
- 3 MyTextBox.Text = foo;
复制代码
在Sliverlight中你就不能用这种
同步调用的做法了。对于那些没有作过异步编程的开发人员来说可能会觉得迷茫,但这是值得学习的,因为通过它你会成为一名更优秀的开发人员。在Silverlight中,上面的伪代码应该被写成这样:
- 1 MyWebService svc = new MyWebService();
- 2 svc.Completed += new CompletedHandler(OnCompleted);
- 3 svc.GetSomeValue();
- 4
- 5 void OnCompleted(object sender, EventArgs args)
- 6 {
- 7 MyTextBox.Text = args.Result;
- 8 }
复制代码
注意到你在一个Completed事件处理器中使用服务返回的结果,这个调用模式你将会在基本数据访问中经常看到。