[玩转Silverlight]第四回:基础篇,在Silverlight中使用基于WCF的REST服务(下)

《你必须知道的.NET》网站 | Anytao技术博客 

[玩转Silverlight]第四回:基础篇,在Silverlight中使用基于WCF的REST服务(下)

发布日期:2009.02.20 作者:Anytao
© 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处。


书接上文:第三回:基础篇,在Silverlight中使用基于WCF的REST服务(上)

REST(Representational State Transfer,具象状态传输)是个好东西,具有诸多的优点值得拿来分享,在WEB更加开放的今天,尽管我们不能否认SOAP在客户端-服务器交互中的大放异彩,但同样也不能抹杀其他技术带来的独特风景和魅力,REST就是其中之一。同时,作为.NET 3.5中WCF框架的重量级飞跃,基于WCF的RESTful服务也让习惯了.NET平台的追随者看到曙光,那么本文的目的正是在上述技术的基础上通过Silverlight视角来消费崭新的REST服务,带领大家体验一下RESTful在Silverlight中的应用。

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方式来实现,具体如何应用WebClient实现数据通信,可以参考《第一回:基础篇,品尝与HttpHandler通信》,调用的过程大同小异,例如以获取所有用户信息为例:

// 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方式加载自己的图片管理。

 

参考文献

温故知新


anytao | © 2009 Anytao.com

2009/02/20 | http://anytao.cnblogs.com/

原文地址:http://www.cnblogs.com/anytao/archive/2009/02/20/anytao_silverlight_04_rest_part2.html

本文以“现状”提供且没有任何担保,同时也没有授予任何权利。 | This posting is provided "AS IS" with no warranties, and confers no rights.

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2009-02-20 00:18  Anytao  阅读(3469)  评论(14编辑  收藏  举报