在Silverlight中使用基于WCF的REST服务PartII

Host WCF REST 

WCF编程模型的最多优点就是提供灵活的扩展机制,寄宿WCF REST服务同样非常的简单,我们通过两种方式Selft-Host和IIS Host来演示实现的过程,其中每种方式以配置形式简化终结点的创建过程。

Selft Host

首先是配置文件的设置:

<configuration>
<
system.serviceModel>
<
services>
<
service name="Anytao.SLScenario.Service.PostService">
<
endpoint address="http://localhost:6666/PostService" binding="webHttpBinding"
contract="Anytao.SLScenario.Service.IPostService" behaviorConfiguration="postbehavior"/>
</
service>
</
services>
<
bindings>
<
webHttpBinding>
<
binding name="secure">
<
security mode="Transport">
<
transport clientCredentialType="Basic"/>
</
security>
</
binding>
</
webHttpBinding>
</
bindings>
<
behaviors>
<
endpointBehaviors>
<
behavior name="postbehavior">
<
webHttp/>
</
behavior>
</
endpointBehaviors>
</
behaviors>
</
system.serviceModel>
</
configuration>

然后以WebServiceHost注册相应的Endpoint,实现上很简单:

// Release : 2009/02/20 
// Author : Anytao, http://www.anytao.com 
static void Main(string[] args)
{
string baseUri = "http://localhost:6666/PostService";
WebServiceHost sh = new WebServiceHost(typeof(PostService),
new Uri(baseUri));

sh.Opened += (s1,s2) =>
{
Console.WriteLine("Service begin to listen via {0}", baseUri);
};

sh.Open();
Console.ReadLine();
}

F5运行,基于REST的WCF服务就被发布,通过URL即可访问相应的服务例如:

 

如果想了解某个人发表的文章情况,只需在URL中输入人名,那么得到的结果将是:

哈哈,我们的REST服务经受了考验,等待Silverlight应用的光顾和消费了。

IIS Host

将Service Host到IIS是最常见的选择,其好处我们就不必都说,Artech兄在其blog中给了我们很多讨论的素材,我们要做的事情包括以下几个方面:

  • 创建PostService.svc文件
<%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Language="C#" Debug="true" Service="Anytao.SLScenario.Service.PostService" %>
  • 配置web.config
<system.serviceModel>
<
services>
<
service name="Anytao.SLScenario.Service.PostService">
<
endpoint address="" binding="webHttpBinding" contract="Anytao.SLScenario.Service.IPostService" behaviorConfiguration="postbehavior"/>
</
service>
</
services>
<
bindings>
<
webHttpBinding>
<
binding name="secure">
<
security mode="None">
</
security>
</
binding>
</
webHttpBinding>
</
bindings>
<
behaviors>
<
endpointBehaviors>
<
behavior name="postbehavior">
<
webHttp/>
</
behavior>
</
endpointBehaviors>
</
behaviors>
</
system.serviceModel>
  • 添加跨域策略文件clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8"?>
<
access-policy>
<
cross-domain-access>
<
policy>
<
allow-from http-request-headers="*">
<
domain uri="*"/>
</
allow-from>
<
grant-to>
<
resource path="/" include-subpaths="true"/>
</
grant-to>
</
policy>
</
cross-domain-access>
</
access-policy>
  • 在IIS创建应用,Host到服务目录并发布。

以IIS Host方式加载REST服务,就是这么简单,其中跨域策略文件是基于Silverlight应用的数据通信所必须提供的安全机制,在此不做过多讨论。

在Silverlight中消费REST

创建Silverlight应用的过程就不做过多陈述,我们首先通过项目结构来了解系统大致的模块划分和模块关系:

 

  • Anytao.SLScenario.IISHost,Host REST服务到IIS。 
  • Anytao.SLScenario.REST, Silverlight应用,消费REST服务。
  • Anytao.SLScenario.REST.Web,ASP .NET应用,托管Silverlight包,提供对外平台。 
  • Anytao.SLScenario.SelfHost,Self Host REST服务。 
  • Anytao.SLScenario.Service,提供REST 服务的定义及实现。

而在Silverlight中消费REST服务,我们以WebClient方式来实现,调用的过程大同小异,例如以获取所有用户信息为例:

// Release : 2009/02/12 
// Author : Anytao, http://www.anytao.com 
private void btnGetAllUser_Click(object sender, RoutedEventArgs e)
{
string url = "http://localhost:1234/RESTService/PostService.svc/";
WebClient wc = new WebClient();
wc.DownloadStringCompleted += (obj, ex) =>
{
if (null == ex.Error)
{
BindData(ex.Result);
}
};
wc.DownloadStringAsync(new Uri(url, UriKind.Absolute));

}

其他服务的消费均可以通过这种方式来完成,在Silverlight中我们可以对返回的数据进行操作,或者将其绑定到Silverlight数据控件,这都是我们随心所欲的事情啦。

小结

本文以REST为主线,将WCF REST相关的概念进行了一一梳理,并在理论的基础上创建实例化应用,以实际的服务提供、客户消费方式对Silverlight中实现REST通信进行了 探讨,希望本文能提供一个较为全面的铺垫,为我们畅快淋漓的感受Silverlight做好基础上的准备。例如,在此基础上我们可以很容易的对Flickr REST服务进行访问,以Silverlight方式加载自己的图片管理。

共有0个回答