消耗服务
VS2008的Silverlight工具提供了内置功能来创建用Silverlight激活的WCF服务并且在不需要编写大量代码的情况下消耗WCF服务。Silverlight 3现在支持二进制XML,这一功能可以用更快的速度把数据从服务器传到客户端。如果需要的话,标准SOAP信息也能被传送。
如果你以前消耗过一个ASP.NET ASMX Web 服务,那么你会觉得消耗WCF服务易如反掌。VS2008的新增服务引用对话框允许你选取该服务并在不编写大量代码的情况下生成客户端。生成代理前,要明白Silverlight只能调回到原始服务器,在原始服务器上,会默认提供Silverlight XAP应用程序文件。
如果你需要调用一个WCF服务,该服务可能存在于不同域或不同端口中,那么该服务必须拥有客户访问政策文件,文件名为clientaccesspolicy.xml,文件位于服务器低端。Silverlight会检查这个文件以查看是否该文件被允许执行跨域的调用。
下面的例一展示了一个样本文件:
- < ?xml version="1.0" encoding="utf-8"?>
- < access-policy>
- < cross-domain-access>
- < policy>
- < allow-from>
- < domain uri="*"/>
- < /allow-from>
- < grant-to>
- < resource path="/" include-subpaths="true"/>
- < /grant-to>
- < /policy>
- < /cross-domain-access>
- < /access-policy>
例一:客户访问政策文件可以放置到服务器低端以便允许Silverlight客户来调用处于不同域或运行于不同端口的服务。
为了创建一个WCF服务代理,你首先需要创建一个Silverlight应用程序项目。一旦该项目被创建好,你就可以右键单击项目,然后选择添加服务参考。如下所示,系统会提供Add Service Reference对话框,图一显示出Add Service Reference对话框可以在没有大量代码的情况下快速而简便地生成客户代理。
图一:
如果WCF服务位于相同的VS方案中,你可以点击Discover按钮。否则,你就要输入到达Address文本框中Web Service Description Language(WSDL)文件的路径。一旦文件被定位,你就可以给代理代码一个命名空间,然后点击确认按钮。
一旦客户代理被创建,你就可以调用Silverlight应用中的服务。要记住所有与Silverlight一起发生的网络操作都是异步的,因此服务被调用的时候,浏览器不会锁定。
例二展示了一个使用客户代码调用服务和绑定数据的示例:
- void MainPage_Loaded(object sender, RoutedEventArgs e)
- {
- //Create service proxy
- WcfService.Service1Client proxy = new WcfService.Service1Client();
- //Wire the proxy to a completed handler to allow the async operation to be handled
- proxy.GetCustomerCompleted +=
- new EventHandler< WcfService.GetCustomerCompletedEventArgs> (
- proxy_GetCustomerCompleted);
- //Call the service asynchronously
- proxy.GetCustomerAsync(id);
- }
- void proxy_GetCustomerCompleted(object sender, SilverlightApplication1.WcfService.GetCustomerCompletedEventArgs e)
- {
- //Bind the returned data to the DataContext
- this.DataContext = e.Result;
- }
例二;使用一个客户代理对象来调用Silverlight中的WCF服务。
看一看例二中的代码,你可以看出代理对象是***被创建,然后通过一个事件驱动型模式,被名为proxy_GetCustomerCompleted的异步事件处理器捆绑起来。该服务通过援引GetCustomerAsync方法被异步调用。一旦服务返回了数据,调回方法会被自动调用,GetCustomerCompletedEventArgs参数会被访问以检索数据。在这个示例中,数据被直接绑定到应用程序的DataContext属性中。注意不需要有额外的操作来设定数据传递路线。代理会自动处理所有的事情。
Silverlight应用程序不能直接调用一个数据库,但是他们可以从一系列诸如WCF服务,ASMX服务和其他标准兼容等服务中存取数据。
【编辑推荐】