前段时间一直翻译《WCF技术内幕》,所以这个系列停滞了下来,现在翻译工作完成。现在继续来写《WCF4.0新特性体验》这个系列。今天我们来学习一下Rest WCF服务,文章会先介绍一下Rest的基本概念,以及特点,其次会介绍WCF如何实现对Rest的支持,也就是Rest WCF的底层机制。重点提到其中几个重要的类型。最后会介绍WCF4.0中对于Rest编程的改进。如此组织也是为了大家可以对Rest 以及Rest WCF 服务有个全面系统的了解。最后我也会提供一个Rest WCF的例子代码,供大家参考。
那么我们现在就开始本节的学习,首先我们要了解什么是Rest。
【1】什么是Rest:
REST软件架构是由Roy Thomas Fielding博士2000年在他的论文《Architectural Styles and the Design of Network- based Software Architectures》首次提出的。他提出的理论对后来的Web技术的发展产生了巨大的影响,他是许多重要Web架构标准的设计者,这些标准就是HTTP、URI等。
1.1) Rest的英文全称是“Representational State Transfer”。中文翻译为“表述性状态转移”。REST本身只是为分布式超媒体系统设计的一种架构风格,而不是标准。
1.2)那么如何理解“Representational State Transfer”这句话呢?下面我们来解释一下:
1.3)REST=老的Web规范+3个新的规范:
REST实际上也是基于已有的Web规范集合产生的。传统的Web应用大都是BS系统,这些系统共同遵循一些老的Web规范,这些规范主要包含3条:
REST在原有的架构上增加了3个新规范:统一接口、分层系统和按需代码:
【2】Rest的特点:
由于Rest遵守的这些规范,因此Rest架构的特点也非常的明显:
1)REST是一种架构,而不是一个规范。
2)REST是一种典型的Client-Server架构,但是强调瘦服务器端,服务器端只应该处理跟数据有关的操作,所有有关显示的工作都应该放在客户端。
3)在REST架构中,服务器是无状态的,也就是说服务器不会保存任何与客户端的会话状态信息。所有的状态信息只能放在双方沟通的Message(消息)中。
4)REST架构是幂等的,对于相同的请求,服务器返回的结果也是相同的,因此服务器端返回的结果是可以缓存的,既可以存在客户端也可以存在代理服务器端。
5)在REST架构中,所有的操作都是基于统一的方式进行的:
6)分层结构,像TCP/IP的分层结构一样,第n层使用第n-1层提供的服务并为第n+1层提供服务。在REST中,Client-Server之间加入了Proxy层和Gateway层。在这些中间层可以加入一些业务处理以外的功能,譬如:负载均衡,安全控制等等。
7)Code-On-Demand,客户端可以访问服务器端的Resource,但并不知道如何处理服务器端返回的结果,这个处理过程的代码应该是从服务器端发送过来,然后在客户端执行,也就是说客户端的功能是根据需要动态从服务器端获得的。一个很简单的例子,Applet就是从服务器端下载然后在客户端执行的。注意,这个特性是可选的(Optional),也就是说在你的REST实现当中,可以不考虑这个特性。
【3】Rest的优点:
既然Rest风格有这些特点,那么也就具备了许多优点:
【4】Rest的设计原则:
REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则:
(1)网络上的所有事物都被抽象为资源(resource),比如图片、音乐、视频、文字、以及服务等等;
(2)每个资源有唯一的资源标识符(resource identifier),URI定位资源;
(3)通过通用的连接器接口(generic connector interface)对资源进行操作,比如使用 HTTP 标准动词(GET、POST、PUT 和 DELETE)的统一接口完成操作;
(4)对资源的各种操作不会改变资源标识符,URI不变;
(5)所有的操作都是无状态的(stateless)。
【5】WCF如何支持Rest:
既然WCF也支持Rest风格,那么究竟WCF是如何实现对于Rest支持的呢?弄清这一点是学习Rest WCF的关键。
首先在WCF3.0种还没有提供对于Rest的支持,我们还只能设计传统的基于SOAP的RPC风格的WCF服务。而不能够涉及Rest WCF服务。
为了实现于对Rest的支持,在 .NET Framework 3.5 中,WCF 在 System.ServiceModel.Web 组件中新增了编程模型和一些基础架构部件。.NET Framework 3.5 SP1 还做了几项小改进。WCF Web编程模型几个重要类型就是:
1)WebGetAttribute 和 WebInvokeAttribute:
我们知道,在WCF中,对于方法的调用是基于SOAP的Action的,每个客户端发送的SOAP消息都需要指定一个Action的值。这个Action的值和WCF服务的方法对应。每个WCF服务端的操作都有一个特定的Action。通过 OperationContractAttribute.Action 属性设置。看下面的SOAP消息,这个是为了调用WCF默认创建的WCF服务的GetData操作。注意Action的值:http://tempuri.org/IService1/GetData。
在Rest WCF中,基于Action的方法调用转变为了基于URI+Http动词的调用。也就是SOAP Action=URI+Http动词。
这种映射会由WebHttpDispatchOperationSelector 类型来完成,它会把客户端请求的URI+Http动词,映射到特定的服务方法上。
WebGetAttribute 告诉服务方法应该响应 HTTP GET 请求。
WebInvokeAttribute 默认映射为 HTTP POST,但可将WebInvokeAttribute.Method 属性设置为支持所有其他 HTTP 动词(PUT 和 DELETE 等)。例如:
2)UriTemplate 和 UriTemplateTable:
UriTemplate 一个表示统一资源标识符 (URI) 模板的类。可以定义服务操作的路径和HTTP动词。
UriTemplateTable一个表示一组关联 UriTemplate 对象的类。也就是UriTemplate表。
从上面的例子代码,我们也能看出如何使用UriTemplate 定义服务操作的URI和HTTP动词。
3)WebHttpBinding 和 WebHttpBehavior:
WCF Web 编程模型允许开发人员通过 HTTP 请求(这些请求使用朴素的旧的“Plain old XML”(POX) 样式消息,而不是SOAP 的消息)来公开 WCF服务。为了让客户端使用 HTTP 请求与服务进行通信,必须使用附加了 WebHttpBehavior 的 WebHttpBinding 对服务的终结点进行配置。
WebHttpBehavior 行为与 WebHttpBinding 绑定一起使用时,支持 WCF 公开和访问 Web 样式服务。WebServiceHost 会自动将此行为添加到使用 WebHttpBinding 的终结点。例如:
4)WebServiceHost 和 WebServiceHostFactory:
为了支持Web编程模型,WCF框架提供一个新的宿主类型:WebServiceHost。它是一个 ServiceHost 派生类,它是对WCF Web 编程模型的补充。如果 WebServiceHost 在服务说明中找不到终结点,则它将在服务的基址中自动为 HTTP 和 HTTPS 基址创建一个默认终结点。如果用户已在基址中明确配置终结点,则它不会自动创建终结点。WebServiceHost 会自动配置终结点的绑定,以便在安全虚拟目录中使用时与关联的 Internet 信息服务 (IIS) 安全设置一起使用。
WebServiceHostFactory在可动态创建WebServiceHost Web宿主实例以响应传入消息的托管宿主环境中提供 WebServiceHost 的实例的工厂。
5)WCF REST Starter Kit :
在WCF4.0之前的版本,WCF3.5我们可以通过使用WCF开发工具包,来开发出我们的Rest WCF服务。大家可以到http://msdn.microsoft.com/en-us/netframework/cc950529.aspx官方网站下载安装包。这里也有关于Rest WCF的最新的资料。
【6】WCF4.0对Rest的改进:
在WCF4.0中,对于Rest WCF服务的支持做了一些改进,比如错误处理,消息格式(XML, JSON, ATOM, text, binary等等)、简化GET/PUT 请求消息的处理,当然两个比较重要的改进就是:帮助页面、Http缓存。
1)HelpPage(帮助页面):
我们知道,Rest服务没有WSDL服务元数据,因此客户端不能获得服务的元数据信息,更不能产生客户端代码。因此就需要一种途径告诉客户端调用服务的方式。这些信息在WCF4.0就通过HelpPage(帮助页面)来显示给客户端。其实这个帮助页面在WCF3.5里也已经支持,但是WCF4.0做了改进。我们可以看一下例子。
首先我们来定义一个Rest服务,它包含4个操作。代码如下:
启用帮助页面也很简单,就是在WCF服务行为里定义属性,然后启用helpEnabled="true" 。代码如下:
启动WCF服务,我们查看服务的帮助信息如下:

我们可以清楚地看到,每个操作的的信息,以及调用的URI。当然我们也可以点击Method一列的连接,查看每个方法的详细信息。比如我们查看Post方法。结果如图:
这些信息很大程度减少了我们犯错的机会,可以帮助我们调试Rest WCF服务,以及快速编写客户端代码。
2)Http Cache(Http缓存)
Rest的一大优点就是减少Http缓存的使用量,因而提升服务的性能。之前我们需要通过控制Http请求和应答消息头来实现对于缓存的控制。现在在WCF4.0中,提供了一种新的类型AspNetCacheProfile。来配置每个操作的http缓存。CachingParameterInspector类型会处理底层缓存设置的工作。 [AspNetCacheProfile] 也是建立在标准的ASP.NET 输出缓存机制上。在WCF4.0中我们可以直接给每个操作添加这个属性。但是前提是我们要先定义这个缓存。然后在应用到操作上。例如,我们在配置文件中指定缓存的设置信息:
然后在操作上应用这个属性,代码如下:
这样就实现对于Http缓存的设置。
【7】总结
(1)整体上来说,Web、HTTP和URI仅仅是REST风格的一个主要实现。
(2)WCF对于Rest的支持,也是通过基本的Web编程模型来实现的。也就是从SOAP Action到URI+Http动词的转变。
(3)WCF4.0对于Rest 服务的支持在帮助页面(HelpPage)和Http缓存上做了改进,方便我们对于Rest服务操作Http缓存的配置。
讲师:don 浏览数:104
讲师:don 浏览数:73
讲师:don 浏览数:88
讲师:don 浏览数:92
讲师:don 浏览数:73
讲师:don 浏览数:141
讲师:don 浏览数:253
讲师:don 浏览数:127