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中给了我们很多讨论的素材,我们要做的事情包括以下几个方面:
<%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Language="C#" Debug="true" Service="Anytao.SLScenario.Service.PostService" %>
<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>
<?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方式加载REST服务,就是这么简单,其中跨域策略文件是基于Silverlight应用的数据通信所必须提供的安全机制,在此不做过多讨论。
在Silverlight中消费REST
创建Silverlight应用的过程就不做过多陈述,我们首先通过项目结构来了解系统大致的模块划分和模块关系:
而在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方式加载自己的图片管理。