REST 架构风格下的WCF特性简介

  REST(Representational State Transfer)作为一种优秀的架构风格,自诞生以来越来越受广大开发者的青睐。对没有接触过REST的开发人员,可以参阅本人的上一篇博客:对REST架构的理解及Jquery+JSON+RESTful WCF 

由于REST推崇的简易型,以及基于HTTP协议的特点,它又有一些什么样的特性呢。?本问将围绕这个主题分两部分展开,并结合Demo程序加以介绍。第一部分介绍涉及到的知识点,第二部分介绍Demo。


  主要涉及到的知识点如下:
  1、绑定协议与行为(webHttpBinding 与webHttpBehavior)
  2、Action的定义(POST、GET、DELETE、PUT)
  3、URI(Uniform Resource Identifier)的指定
  4、webServiceHost与webServiceHostFactory

*1、绑定协议与行为(webHttpBinding 与webHttpBehavior)
众所周知,WCF中支持的协议有很多,如wsHttpBinding等ws-*系列的、netTcpBinding、支持MSMQ的系列协议等。在构建REST架构风格的WCF中
我们使用的协议为webHttpBinding 。与之相对应的行为则是webHttpBehavior。

MSDN对他们的的描述分别为:
webHttpBinding:一个绑定,可用于为通过 HTTP 请求(而不是 SOAP 消息)公开的 Windows Communication Foundation (WCF) Web 服务配置终结点。
webHttpBehavior:启用 Windows Communication Foundation (WCF) 服务的 Web 编程模型。
WebHttpBehavior 行为与 WebHttpBinding 绑定一起使用时,支持 WCF 公开和访问 Web 样式服务。WebServiceHost 会自动将此行为添加到使用 WebHttpBinding 的终结点。
webHttpBinding作为REST 架构风格下的WCF 所使用的协议,它和其他协议一样通知WCF如何为通讯建立通道堆栈,也就是建立相应的Channel以用于
通讯。webHttpBehavior的作用是为REST WCF的端点提供行为的配置,它决定了WebHttpDispatchOperationSelector如何决定选择何种路由方式
来访问资源。
*2、Action中的各个动词决定了对资源进行何种操作。
POST:对客户端知晓的资源进行添加。它是WebInvokeAttribute默认的操作动作
Get:对资源进行获取。它是WebGetAttribute默认的操作动作
DELETE:对资源进行删除。一般由WebInvokeAttribute指定
PUT:对资源进行添加或者修改。一般由WebInvokeAttribute指定

*3、URI
URI(Uniform Resource Identifier)的指定是通过REST WCF编程模型中的WebGetAttribute、 WebInvokeAttribute两种特性来标识的。它通过将
WebGetAttribute、 WebInvokeAttribute两种特性的UriTemplate属性指定。通常将它指定在服务契约对应的接口上,WebHttpDispathOperationSelector通过URI来决定
对资源进行操作。示例定义如下:
[OperationContract]
[WebGet(UriTemplate = "/")]
List<LogEntity> GetAll();

*4、webServiceHost与webServiceHostFactory
对WCF有些了解的人都知道,它的配置是比较复杂的。REST所推崇的是简易型,因此在REST WCF编程模型中,MS推出了webServiceHost
与webServiceHostFactory来简化我们的配置。webServiceHost继承自ServiceHost,使用它,我们将不再需要对webHttpBinding与
webHttpBehavior进行配置,webServiceHost会自动创建端点,并使用webHttpBinding与webHttpBehavior对其进行配置。
  MSDN中对webServiceHost的说明如下:
  如果 WebServiceHost 在服务说明中找不到终结点,则它将在服务的基址中自动为 HTTP 和 HTTPS 基址创建一个默认终结点。如果用户已在基址中明确配置
终结点,则它不会自动创建终结点。WebServiceHost 会自动配置终结点的绑定,以便在安全虚拟目录中使用时与关联的 Internet 信息服务 (IIS) 安全设置一起使用。
当创建默认 HTTP 终结点时,WebServiceHost 同时禁用 HTTP 帮助页和 Web 服务描述语言 (WSDL) GET 功能,以使元数据终结点不干扰默认 HTTP 终结点。
  此外,WebServiceHost 类会将 WebHttpBehavior 添加到所有没有该行为但具有 WebMessageEncodingElement 的终结点中。如果服务上的所有操作都具有空的 HTTP 请求正文,或者都将 HTTP 请求正文以流的形式处理,则 WebServiceHost 会自动为绑定配置适当的内容类型映射器。
  请注意:在3.5中它会禁用REST WCF中的帮助(help)页面。
WebServiceHostFactory ,继承自ServiceHostFactory,使用它,我们将无需对REST WCF进行配置,只需在svc文件的指令中指定它即可。示例如下:
<%@ ServiceHost Service="LogServices.LogServices" Factory="System.ServiceModel.Activation.WebServiceHostFactory"%>
需要说明的是:Service属性需指明是实现服务契约的类。
第二部分:Demo示例程序。
开发环境:VS2008 SP1
程序结构如下图:


Contracts:定义了服务契约。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[ServiceContract]
public interface Ilog
{
[OperationContract]
[WebGet(UriTemplate = "/")]
List<LogEntity> GetAll();
 
[OperationContract]
[WebGet(UriTemplate = "Get/{year}/{month}")]
List<LogEntity> GetMonthLog(string year,stringmonth);
}
[DataContract]
public class LogEntity
{
[DataMember]
public int ID { get; set; }
 
[DataMember]
public string EventName { get; set; }
 
[DataMember]
public string Level { get; set; }
 
[DataMember]
public DateTime Time { get; set; }
 
}

  

LogServices:实现服务契约,提供服务
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public List<LogEntity> GetAll()
{
return GetLogEntityList();
}
 
public List<LogEntity> GetMonthLog(string year, string month)
{
List<LogEntity> logEntities = GetLogEntityList();
List<LogEntity> logList = new List<LogEntity>();
logEntities.ForEach(log =>
{
if (log.Time.Year.ToString() == year && log.Time.Month.ToString() == month)
{
logList.Add(log);
}
});
return logList;
 
}

  

顺便大家可以看看配置文件,使用WebServiceHostFactory不需要对WCF进行配置。配置文件如下:

  

RESTWCFDemo:寄宿服务,并调用服务。由于REST WCF服务的寄宿需要IIS,所以程序的客户端与服务端直接放在了一个Web工程下面。
直接在IE中调用服务查看运行效果。
1、调用List<LogEntity> GetAll()。结果如下图:

2、调用GetMonthLog。结果如下图:

posted @   tyb1222  阅读(3407)  评论(4编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示