代码改变世界

Silverlight 创建WCF生成客户端代码及测试

2011-11-02 09:42  elivsit  阅读(458)  评论(0编辑  收藏  举报

1.Silverlight可以访问和处理的数据类型

在当前以技术为中心的世界里,数据可以以多种不同的方式进行保存,而且新的技术每天都在不断地发布。幸运的是,Silverlight实际上能够访问和处理所有现有的基于文本类型的数据类型,包括一些比较流行的格式,如可扩展标记语言(Extensible Markup Language,XML)、简单对象访问协议(Simple Object Access Protocol,SOAP)、超文本标记语言(HyperText Markup Language,HTML)、JavaScript对象符号(JavaScript Object Notation,JSON),以及未来可能发布的一些其他格式。

在很多情况下,可以使用内置的Silverlight类将数据转换成自定义对象。例如,DataContractJsonSerializer类就可以用于序列化/反序列化JSON数据,而XmlSerializer类则可以用于序列化/反序列化XML数据。当处理自定义的文本格式时,如某个固定长度的普通文件,可以通过创建特定的类来执行解析操作。

2.Silverlight通信方法

有四种方法可以执行Silverlight应用程序和数据存储库之间的异步调用:包括Web服务、Representational State Transfer(RESTful)调用、套接字以及HTTP轮询双向调用。Web服务使用简单对象访问协议(SOAP)来交换信息(某些服务器也可以使用其他的格式);RESTful调用可以交互不同的数据格式,如XML和JSON;而套接字和HTTP轮询双向调用则允许在Silverlight客户端和服务器之间传送任意类型的数据。Web服务展示了使用Web服务描述语言(Web Service Description Language,WSDL)定义的合同。客户端可以利用WSDL来理解如何与某个服务实施通信。由于有了简单的XML解析器,所以数据可以在不同的社团之间相对透明地进行转移,而不需要依赖于特定的平台、框架以及对象模型。利用Visual Studio或者某个命令行工具,可以创建Silverlight特有的代理对象。而该对象可用于调用Web服务,其方法和利用ASP.NET中的代理对象调用服务的方法一样。这就使得只要编写很少的代码,并且为开发人员抽象了SOAP的序列化/反序列化过程。利用Silverlight调用Web服务并不需要关于XML的知识,因此一旦理解了创建和使用代理对象的过程,该代码就非常直接了当。目前,在Web上存在多个流行的Web服务的替代方法。这些替代方法一般都集中于提供一种更直接的方法来交换数据,从而消除和Web服务相关的一些复杂性。例如,一些流行的站点,如Flickr、MySpace、Digg和eBay都允许利用REST API来访问数据,而某些站点则使用Plain Old XML(POX)来回交换数据。

描述REST的最简单方法就是通过一个例子。Flickr站点提供了一个REST API(还得加上XML-RPC和SOAP API),开发人员可以使用该API来检索他们网站上的照片以及其他信息。对Flickr REST API的RESTful调用的例子如下所示:

  1. http://www.flickr.com/services/rest/?method=flickr.test.echo&format=rest 
  2. &foo=bar&api_key=YourKey 

和所有的URL一样,前面的URL以及后面的URL都将发生改变。

注意,在此使用了标准的URL,并且使用一个查询字符串参数将服务器应该执行的方法或者行为增加到了该URL中。调用该URL将产生如下的POX响应:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <rsp stat="ok"> 
  3. <method>flickr.test.echo</method> 
  4. <format>rest</format> 
  5. <foo>bar</foo> 
  6. <api_key>YourKey</api_key> 
  7. </rsp> 

Digg站点也提供了REST API,以允许通过类似的方法来访问数据。如果想从Digg.com上检索一个故事列表,可以使用如下的RESTful调用:

  1. http://services.digg.com/stories/topic/microsoft?count=3&  
  2. appkey=http://www.smartwebcontrols.com 

3.为Silverlight创建WCF服务

Windows通信基础(Windows Communication Foundation,WCF)是在.NET 3.0中首次发布的,是.NET 3.5的组成部分。它提供了稳健而灵活的框架以构建不同类型的服务。这些服务可以使用不同的语言、平台或者对象模型,并且可以由客户端使用。WCF是建立在一些主要的技术标准之上,如XSD模式、WSDL、SOAP以及WS-*标准(安全、寻址、消息传输、可靠性,等等),并遵循关键的SOA原理,如松耦合合同、绑定(调用服务的方式)和可发现的服务。如果已经熟悉了构建类和实现接口的过程,那么构建WCF服务器将是对正在进行的工作的自然扩展。

WCF有其自身的ABC集合:地址(Address)、绑定(Binding)和合同(Contract)。地址部分表示物理服务的位置;绑定部分表示如何绑定到服务,或者说如何与服务对话(是通过HTTP、TCP还是其他的绑定?);而合同部分则定义服务可以执行哪些操作,以及这些操作的详细信息,如来回传递的数据类型。

为了创建WCF服务,需要执行一些指定的步骤以确保遵守了这些ABC。首先在Visual Studio中创建一个WCF Service Library或者WCF Service Application项目。该项目将把一个引用添加到WCF程序集,如System.ServiceModel,该引用包含了服务所使用的关键类。一旦项目已经创建,就可以创建数据合同类、服务接口和WCF配置代码,等等。

4.通过SvcUtil.exe生成客户端代码和配置

WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用。

下面简单说下如何通过SvcUtil.exe的方式调用服务:

SvcUtil.exe是一个命令行工具,位于:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin目录下,可以将该目录地址在环境变量中配置或者直接用VS命令行工具运行。也可以将SvcUtil.exe添加到VS2010中方便以后的运用,添加方式:在VS2010的Tools菜单中选择External Tools,如下图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

点击添加按钮,在Title栏输入SvcUtil,Command栏选择SvcUtil.exe所在的目录,Initial directory栏选择生成的客户端代码和配置文件所放的目录,选上Prompt for arguments,不选上Close on exit,点击OK完成添加。

添加好以后,点击VS2010菜单下的SvcUtil,输入提供元数据的服务终结点的 URL,如下图

点击OK,在弹出的命令行中会显示成功与否和相关信息。如下图

如果成功的话会生成两个文件,一个是包含了服务端Contract和对应于服务端service的本地代理类的cs文件,一个是WCF配置文件,将这两个文件拷到项目中并将output.config改名为app.config就可以了。
5.WCF测试服务配置
现在你可以测试你的服务,首先测试你的配置文件设置是否正确,在解决方案资源管理器中选中SVC文件,点击右键,在弹出的菜单中选择“在浏览器中查看”,浏览器将会显示关于服务的一些信息,注意自动生成的URL。

  为了测试你的服务是否可以真正调用,Visual Studio提供了WCF测试客户端工具,打开Visual Studio命令行窗口,在命令提示符后输入命令wcftestclient,弹出该客户端窗口后,选择“文件”*“添加服务”选择要测试的服务,然后输入浏览器中显示的URL,从测试客户端,你可以结合数据调用每一个服务方法,并查看结果,WCF测试客户端如图所示。

 

转播到腾讯微博
基于Silverlight应用程序调试WCF服务

 

图2 WCF测试客户端提供了一个方法验证服务是否正确启动

 

 


  界面右侧的“请求”和“响应”区域提供了一个方法进行冒烟测试

  至此,你已经为服务完成了服务端检查,你可以增加你认为合适的操作、业务和数据访问层以扩大你的服务,我总是会增加一个服务测试项目测试服务库,这种测试通常会获得更高回报,在通过Silverlight客户端应用程序诊断服务问题时,可以帮助我避免掉耗时且令人沮丧的问题。