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

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

  什么是REST?

  最早REST概念由Roy Fielding在Architectural Styles and the Design of Network-based Software Architectures文提出利用现有技术(REST是基于HTTP协议)实现通过唯URI来操作唯资源方式提供WEB服务例如可以通过

  http://www.anytao.com/book/insidenet/ch1

  方式来读取[你必须知道.NET]书第内容而通过

  http://www.anytao.com/book/insidenet/ch1/create

  或者

  http://www.anytao.com/book/insidenet/ch1/delate

  来增加或者删除相应内容

  你看RESTful服务更加符合人类习惯思维简化了资源和操作在web架构中体系结构整理总结起来REST应用基本原则体现在以下几个方面:

  
  • 通过URI标识唯资源并通过HTTP谓词(GET, POST, PUT, DELETE)进行资源操作   资源是自描述意味着资源信息包含在资源请求本身我们将在后面举例中感受

      所有操作都是无状态

      
  如果对REST还有更多了解兴趣可以参考:Building Web Services the REST Way详细介绍那么REST有什么样优点值得吸引我们目光呢?除了其处理资源方式更加符合我们习惯思维其强大优势还体现在:

  
  • 简单易懂URI本身就公开了所有操作意义那么对于WEB消费而言其简单性来得直截了当因此我喜欢   统接口设计接口设计是基于统资源操作必然结果实现了服务层次低耦合保证了系统简化

      扩展性资源是自描述那么其本身包含了所有必要信息对于扩展而言这是最方便机制

      
  下面是有关REST些有用资源仅供参考:

  
  • REST _disibledevent=>A Brief Introduction to REST

      REST in Plain English

      RESTful .NET Fundamentals (training)

      RESTful Web Services (book)

      RESTful .NET (book)

      RESTy DayTrader

      WCF REST Starter Kit

      
  既然有这么多眼花缭乱好处和愿景那么我们就可以开始利用WCF小试牛刀喽:-)

  创建基于WCFRESTful服务

  必要准备

  为了实现个常用REST服务场景就必须首先搭建个必要舞台:

  [玩转Silverlight]第 3回:基础篇<img src='/icons/84802dou.gif' />在Silverlight中使用基于WCF<img src='/icons/84802de.gif' />REST服务(上)

  其中包括以下几个实体:

  
  • User用户   Post用户发布文章

      Comments文章评论

      
  同时对外提供以下服务:

  
  • GetAllUsers获取所有用户信息   GetPostsByName按照用户名称获取其发布所有文章信息

      GetPostByID按照文章ID获取该篇文章信息

      GetCommentByAuthor按照评论者姓名获取其评论信息

      AddComment添加按照文章添加评论

      
  详细情况我们将在后文创建过程中逐层解开

  WCFREST基础

  .NET 3.5中实现了WCF扩展从而可以在SOAP和REST中作出更多选择我们在了解REST基础上就可以轻而易举对WCFREST支持有个快速认知首先值得关注是WCF中系列重要支持框架需要重点关注是:

  
  • WebGetAttribute和WebInvokeAttribute其中WebGet标识调度响应HTTP GET请求而WebInvoke则标示调度响应任何HTTP请求其中以WebInokeAttribute.Method属性来标识默认情况下映射为HTTP POST以WebGet为例
[AttributeUsage(AttributeTargets.Method)]
public sealed WebGetAttribute : Attribute, IOperationBehavior, IWmiInstanceProvider
{
  public WebGetAttribute;
  public WebMessageBodyStyle BodyStyle { get; ; }
  public bool IsBodyStyleSetExplicitly { get; }
  public bool IsRequestFormatSetExplicitly { get; }
  public bool IsResponseFormatSetExplicitly { get; }
  public WebMessageFormat RequestFormat { get; ; }
  public WebMessageFormat ResponseFormat { get; ; }
  public UriTemplate { get; ; }
}


  其中UriTemplate是WCF为每种资源以模板方式定义URI使用思路方法和动词组合例如:

[WebInvoke(UriTemplate = "/{name}/{post}", Method = "POST")]
Comment AddComment( name, post, Comment comment);


  RequestFormat和ResponseFormat是WebMessageFormat类型成员其表示了Request和Response过程传输格式为Xml或者Json:

public enum WebMessageFormat
{
  Xml = 0,
  Json = 1,
}


  那么按照WCF REST定义语法我们开始定义个完整IPostService Contract如下:

// Release : 2009/02/12              
// Author : Anytao, http://www.anytao.com
[ServiceContract(Namespace="http://api.anytao.com/rest/")]
public erface IPostService
{
  [OperationContract]
  [WebGet(UriTemplate = "/", ResponseFormat = WebMessageFormat.Xml)]
  List<User> GetAllUsers;
  [OperationContract]
  [WebGet(UriTemplate = "/{name}", ResponseFormat = WebMessageFormat.Xml)]
  List<Post> GetPostsByName( name);
  [OperationContract]
  [WebGet(UriTemplate = "/{name}/{post}", ResponseFormat = WebMessageFormat.Json)]
  Post GetPostByID( name, post);
  [OperationContract]
  [WebGet(UriTemplate = "/{name}/{post}/{comment}", ResponseFormat = WebMessageFormat.Json)]
  Comment GetCommentByAuthor( name, post, comment);
  [OperationContract]
  [WebInvoke(UriTemplate = "/{name}/{post}", Method = "POST")]
  Comment AddComment( name, post, Comment comment);
}


  
  • WebHttpBinding和WebHttpBehavior就像BasicHttpBinding和BasicHttpBehavior用于确定WCF通信方式WebHttpBinding用于为通过HTTP请求公开WCF服务配置终结点WebHttpBehavior则完成对于“URI+谓词”启动为WebHttpBinding支持Web样式服务提供支持WCF服务WebHttpBinding可以通过编码方式和配置方式两种途径完成当然我们更推荐是配置方式:
 <bindings>
  <webHttpBinding>
   <binding name="secure">
    <security mode="Transport">
     <transport clientCredentialType="Basic"/>
    </security>
   </binding>
  </webHttpBinding>
 </bindings>
 <behaviors>
  <endpoBehaviors>
   <behavior name="postbehavior">
    <webHttp/>
   </behavior>
  </endpoBehaviors>
 </behaviors>


  
  • WebServiceHost和WebServiceHostingFactory顾名思义WebServiceHost承载利用配置终结点绑定而WebServiceHostingFactory利用工厂模式进行WebServiceHost创建工作在Self Host时我们可以利用WebServiceHost简化对WebHttpBinding和WebHttpBehavior配置过程例如:
// Release : 2009/02/19              
// Author : Anytao, http://www.anytao.com
void Main( args)
{
   baseUri = "http://localhost:6666/PostService";
  WebServiceHost sh = WebServiceHost(typeof(PostService),
                     Uri(baseUri));
  sh.Opened (s1,s2) =>
    {
      Console.WriteLine("Service begin to listen via {0}", baseUri);
    };
  sh.Open;
  Console.ReadLine;
}


  我们将在下面创建过程中逐步接触这些概念及其应用

  Note:下面是WCF REST有用资源:WCF REST Starter Kit

  实现WCFREST服务

  实现WCFREST服务和WCF服务并无 2致都是通过实现契约接口对提供服务进行具体实现限于篇幅我们仅将GetPostByName服务做以举例:

// Release : 2009/02/19              
// Author : Anytao, http://www.anytao.com
public PostService : IPostService
{
  private List<User> users;
  public List<Post> GetPostsByName( name)
  {
    User user = (from u in users
           where u.Name name
           select u).Single;
     user.Posts;
  }
}


  下篇预告

  在下篇我们将在本文理论分析基础上实现个具体消费例子主要包括以下内容:

  
  • 两种方式Host WCF RESTful服务   在Silverlight中消费WCF RESTful服务

      
  文章来源:http://anytao.cnblogs.com/

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

  系列文章:

  [玩转Silverlight]第回:基础篇品尝和HttpHandler通信

  [玩转Silverlight]第 2回:应用篇Silverlight本地化

  [玩转Silverlight]第 3回:基础篇在Silverlight中使用基于WCFREST服务(上)



  [玩转Silverlight]第 4回:基础篇在Silverlight中使用基于WCFREST服务(下)

  Silverlight 2中多语言支持实现(上)

  Silverlight 2中多语言支持实现(下)



Tags: 

延伸阅读

最新评论

发表评论