Sevendays

不积跬步,无以至千里;不积小流,无以成江海。

导航

构建基于WCF的RESTful服务

Posted on 2009-10-30 10:22  Sevendays  阅读(829)  评论(0编辑  收藏  举报

标签: WCF,RESTful

 

RESTful服务使用的是成为具象状态传输(Representational State Transfer, REST)的体系结构风格

了解REST体系结构

     体系结构风格是一组可在执行构建时应用的约束。软件的体系结构风格会对功能做出说明,这些功能用于指导建立软件系统。REST 这一体系结构风格所构建的软件供客户端(用户代理)请求服务(端点)之用。REST 是实现客户端/服务器体系结构风格的一种途径——REST 实际上是明确构建在客户端/服务器体系结构风格之上的。

REST 这一术语最早是由 Roy Thomas Fielding 在他的博士论文(“体系结构风格和基于网络软件体系的设计”)中提出的。他当时参与制订的规范对于今天的互联网起到了巨大的推进作用,这个规范就是:超文本传输协议 (HTTP)。一般来讲,体系结构风格描述人的背景与风格讨论并无干系,但这一观点在此并不适用,因为我认为能对 REST 产生基本了解的最佳途径之一是思索 Web 及其工作方式。

我必须假定您作为开发人员对 Web 很熟悉,或者可能象我一样,每天都使用 Web 或对其痴迷。事实证明,Web 在任何时候皆可视为最大、伸缩性最强且最流行的分布式应用程序。REST 的约束采用的就是掌控 Web 的基本原则。这些原则是:

用户代理与资源交互,任何可命名和表达的事物都可称为资源。每项资源都有一个唯一的统一资源标识符 (URI)。

与资源的交互(通过其唯一的 URI 定位)使用 HTTP 标准动词(GET、POST、PUT 和 DELETE)的统一接口完成。交互中声明资源的媒体类型也很重要,它使用 HTTP 内容类型标头指定。(XHTML、XML、JPG、PNG 和 JSON 就是一些广为人知的媒体类型。)

资源是自我描述的。处理资源请求所需的全部信息均包含在请求本身内(这样服务可以没有状态)。

资源包含到其他资源的链接(超媒体)。

WCF 和 REST

      WCF 是 Microsoft 的框架,用于构建使用网络通信的应用程序,无论其风格和协议为何。WCF 是要创建一个可扩展且可嵌入的框架,这样,开发人员就能学习一种编程与配置模型,将这些技能应用于多种不同的分布式系统。

虽然 WCF 的主要作用是配合 RPC(使用 SOAP),但是由于最初是做为 .NET Framework 3.0 的一个部件发布的,它的确可以公开并使用 REST 服务。它所缺乏的是能轻松搭配使用 REST 和 WCF 的编程模型。要将 REST 与 .NET Framework 3.0 配合使用,您还必须构建基础架构的一些部件。在 .NET Framework 3.5 中,WCF 在 System.ServiceModel.Web 组件中新增了编程模型和这些基础架构部件。.NET Framework 3.5 SP1 还多了几项小改进。

编程模型有两个主要的新属性:WebGetAttribute 和 WebInvokeAttribute;还有一个 URI 模板机制,帮助您声明每种方法响应用的 URI 和动词。基础架构的组成是一个绑定 (WebHttpBinding) 和一种行为 (WebHttpBehavior),为使用 REST 提供适宜的连网堆栈。此外,自定义的 ServiceHost (WebServiceHost) 和 ServiceHostFactory (WebServiceHostFactory) 还提供了一些托管基础架构方面的帮助。

实例

      构建 RESTful 服务时,您可通过完成一组非常简单的基本步骤来设计自己的服务。

您需要什么样的资源?

将使用哪些 URI 表示这些资源?

每个 URI 将支持统一接口的哪些部件(HTTP 动词)?

1.前提您已对确定 RESTful 端点设计的步骤有了大致的了解,下面我们就来设计服务中的资源,

下表中显示了资源、url和动词的完整列表:

资源 REST 格式 请求方式 参数
获取所有用户 "/" GET
获取特定ID的用户 "/{userId}" GET url:userId
添加单个用户 "addUser" POST 发送xml,格式为:<user><age>1000</age> <id></id> <name>name1</name> </user>
添加一组用户 "addUserS" POST 发送xml,格式为:<userCollection><user><age>1000</age> <id></id> <name>name1</name> </user>……</userCollection>
初始化用户并返回初始值 "reset" GET

2.接下来我们就一步一步创建RESTful服务,

首先我们项目中新建一个VS2008提供的AJAX-enabled WCF Service(启用了Ajax的WCF服务)

在服务类上添加描述

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

(具体含义网上有很多解释与配置文件里

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>一起配置的

注意:

(1). 缺省情况下,我们无法使用 UriTemplate,必须把配置文件中 "enableWebScript" 注释掉。

<behaviors>
      <endpointBehaviors>
        <behavior name="Rest1029.ServiceAspNetAjaxBehavior">
          <!--<enableWebScript />-->
        </behavior>
      </endpointBehaviors>
    </behaviors>

(2). 必须在 .svc 中添加 "WebServiceHostFactory"。

<%@ ServiceHost Language="C#" Debug="true" Service="Restful1029.Service" CodeBehind="Service.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

 

3.用WebClient对象来访问测试,也可以用Fiddler软件来测试。

 

          WebClient client = new WebClient();
          client.Headers[HttpRequestHeader.ContentType] = "application/xml";
          client.Encoding = Encoding.UTF8;
          string xmlString=string.Format("<user><age>{0}</age>  <id></id> <name>{1}</name> </user>",tbxAge.Text,tbxName.Text);
          for (int i = 0; i < 10; i++)
          {
              xmlString = xmlString + xmlString;
          }
          xmlString = "<userCollection>" + xmlString + "</userCollection>";
              lbMess.Text = client.UploadString(GetAbsoluteUri("Service.svc/addUserS"), "POST", xmlString);
       以上代码是用post方式添加用户。
 
 示例源码下载
  

 

标签: WCF,RESTful