概述

Representational State Transfer(REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。

因此REST是设计风格而不是标准,REST通常基于使用HTTP,URI,和JSON,XML以及HTML这些现有的广泛流行的协议和标准。
  • 资源是由URI来指定,rest中的资源需要使用名词来命名。
  • 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
  • 通过操作资源的表形来操作资源。
  • 资源的表现形式则是XML,JSON或者两者都有。
REST的要求
  • 显示的使用HTTP方法访问资源
  • 连接协议具有无状态性
  • 能够利用Cache机制增进性能
  • 公开目录结构式的URL
  • 在需要时可以传输Javascript (可选)
REST的优点
  • 可以利用缓存Cache来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好

在WCF中构建REST

一、按一下结构创建项目,其中WCF.REST.Services项目选用WCF REST Service Template 40(CS)模板

Contracts引用System.ServiceModel和System.ServiceModel.Web

Services引用Contracts

二、在Contracts项目中创建接口个传输类:传输类会在调用的客户端等地方使用,建议使用全小写,以免调用时产生疏忽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
  
namespace WCF.REST.Contracts
{
    /// <summary>
    /// 该类用于传输
    /// </summary>
    public class item
    {
        public int id { get; set; }
        public string name { get; set; }
        public decimal money { get; set; }
        public DateTime birthday { get; set; }
        public int number { get; set; }
    }
}

三、在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
28
29
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;
  
namespace WCF.REST.Contracts
{
    /// <summary>
    /// 服务协议
    /// </summary>
    [DataContractFormat]
    [ServiceContract]
    public interface IItem
    {
        [WebGet(UriTemplate = "")]
        List<item> GetCollection();
  
        [WebInvoke(UriTemplate = "", Method = "POST")]
        item Create(item instance);
  
        [WebGet(UriTemplate = "{id}")]
        item Get(string id);
  
        [WebInvoke(UriTemplate = "{id}", Method = "PUT", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        item Update(string id, item instance);
  
        [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
        void Delete(string id);
    }
}

四、在Services中创建逻辑类,用于存储列表:真实项目时这个类可以单独放在业务逻辑层中。

1
2
3
4
5
6
7
8
9
10
11
12
13
using System.Collections.Generic;
using WCF.REST.Contracts;
  
namespace WCF.REST.Services
{
    /// <summary>
    /// 服务逻辑
    /// </summary>
    public static class ItemsBL
    {
        public static List<item> list = new List<item>();
    }
}

五、在Services中创建服务类:这是服务的具体实现。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Activation;
using WCF.REST.Contracts;
  
namespace WCF.REST.Services
{
    /// <summary>
    /// 服务实现
    /// </summary>
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Items : IItem
    {
        public List<item> GetCollection()
        {
            return ItemsBL.list;
        }
  
        public item Create(item instance)
        {
            lock (ItemsBL.list)
            {
                if (ItemsBL.list.Count > 0)
                    instance.id = ItemsBL.list.Max(p => p.id) + 1;
                else
                    instance.id = 1;
            }
            ItemsBL.list.Add(instance);
            return instance;
        }
  
        public item Get(string id)
        {
            return ItemsBL.list.FirstOrDefault(p => p.id == int.Parse(id));
        }
  
        public item Update(string id, item instance)
        {
            int iid = int.Parse(id);
            item Result = null;
            lock (ItemsBL.list)
            {
                if (ItemsBL.list.Count(p => p.id == iid) > 0)
                {
                    ItemsBL.list.Remove(ItemsBL.list.FirstOrDefault(p => p.id == iid));
                    ItemsBL.list.Add(instance);
                    Result = instance;
                }
            }
            return Result;
        }
  
        public void Delete(string id)
        {
            int iid = int.Parse(id);
            lock (ItemsBL.list)
            {
                if (ItemsBL.list.Count(p => p.id == iid) > 0)
                {
                    ItemsBL.list.Remove(ItemsBL.list.FirstOrDefault(p => p.id == iid));
                }
            }
        }
    }
}

六、修改Global文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.ServiceModel.Activation;
using System.Web;
using System.Web.Routing;
  
namespace WCF.REST.Services
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            RegisterRoutes();
        }
  
        private void RegisterRoutes()
        {
            RouteTable.Routes.Add(new ServiceRoute("Items", new WebServiceHostFactory(), typeof(Items)));
        }
    }
}

七、运行服务在地址栏后添加 /items/help 后看到如下界面

ok至此服务部分完成。

WCF REST 基础教程的更多相关文章

  1. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  2. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  3. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

  4. Memcache教程 Memcache零基础教程

    Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...

  5. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  6. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  7. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  9. oracle基础教程(8)oracle修改字符集

    oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...

随机推荐

  1. Codefroces Educational Round 27 845G Shortest Path Problem?

    Shortest Path Problem? You are given an undirected graph with weighted edges. The length of some pat ...

  2. GetInvocationList 委托链表

    最近发现C#程序初始化时在构造函数中,偶尔出现事件注册不成功.后查资料发现有GetInvocationList 这么一个获取类中的委托链表的函数, 使用方法如下: 1.在需委托的类(Class1)中增 ...

  3. DataGridView控件绑定数据源

    前言: 近期听说DataGridView控件能直接绑定数据源.而不用穿越这层那层的忍辱负重.获取数据.真是高兴的屁颠屁颠的.后来一想二狗肯定不会弄.特意写了一个笨蛋版的教程--也算记录生活.欢度端午了 ...

  4. 【开卷故意】JAVA正則表達式模版

    专业既然是机器学习.那工作肯定也是继续和数据打交道,那么问题来了,非常多时候推荐算法和数据挖掘算法都是现成可用的,平台初建,重点还在数据过滤和抽取.如何高效的抽取数据? 利用往常算法比赛中经常使用的字 ...

  5. 使用TCP协议的NAT穿透技术 (转载)

    其实很早我就已经实现了使用TCP协议穿透NAT了,但是苦于一直没有时间,所以没有写出来,现在终于放假有一点空闲,于是写出来共享之. 一直以来,说起NAT穿透,很多人都会被告知使用UDP打孔这个技术,基 ...

  6. jquary依据td中button的元素属性删除tr行(删选出想删除的行)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcnVveXVhbnlp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  7. onvif开发之设备发现功能的实现--转

    忙了一个多月,onvif总算告一段落了.这几个星期忙着其他的项目,也没有好好整理一下onvif的东西.接下来得好好整理一下自己的项目思路和项目经验,同时将自己的一些心得写出来,希望对人有所帮助. 相信 ...

  8. Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)

    转自:http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html 比较的是四种复制的方式,分别为Apache的BeanUtils和Prope ...

  9. JSTL之C标签学习

    JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...

  10. [置顶] MVC三层架构在各框架中的特征

    1.从结构上分析jsp+servlet图解原理: 在基于mvc设计模式下的最原始的jsp+Servlet框架,在某种程度上是不能够达到mvc最直观的体现.当客户端发送请求到服务器时,服务器会将从客户端 ...