概述

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. 基于x86平台的Solaris安装视频(时长25分钟)

    基于X86平台的Solaris安装视频 本视频分为三个部分分别在附件中1.2.3(第三部分附件较大请在这里下载:http://down.51cto.com/data/263614) ,远程连接的视频由 ...

  2. 认识Linux瘦客户机

           (本文完整版见http://os.51cto.com/art/201001/181448.htm)        随着Linux的发展,以及网络计算技术的发展和逐步深入的云计算,基于Li ...

  3. 2018 java实训总结(时间戳&&主键)

    java实训题目:源管理系统. 答辩的时候被老师怼了以下几个的地方: 1.主键改变了 2.没时间戳却说自己的程序里有先后(这就是老师迂腐了,主键自增可以间接反馈出他加入的早晚,即使主键做出了改变但只是 ...

  4. C# WinForm设置透明

    1:通过设置窗体的 TransparencyKey实现  例:窗体中的白色会变成透明      this.BackColor =Color.White; this.TransparencyKey = ...

  5. 数字签名算法--3.ECDSA

    package Imooc; import java.security.KeyFactory; import java.security.KeyPair; import java.security.K ...

  6. Oracle442个应用场景-----------Oracle数据库物理结构

    -------------------------Oracle数据库物理结构------------------------------- Oracle数据库物理结构     oracle的数据,实际 ...

  7. codeforces 204E. Little Elephant and Strings(广义后缀自动机,Parent树)

    传送门在这里. 大意: 给一堆字符串,询问每个字符串有多少子串在所有字符串中出现K次以上. 解题思路: 这种子串问题一定要见后缀自动机Parent树Dfs序统计出现次数都是套路了吧. 这道题统计子串个 ...

  8. 高中生活-第9篇-开学之初的“失足”囧事,"刻舟求剑"导致腿折了

    时间过得好快啊,上次发表"高中生活-第8篇:夏天的空调,冬天的味道"是2014年9月30日,一转眼,就是一年啊. 我自己以为,很多人可能都以为,我又半途而废了,实则不是哦~ 行百里 ...

  9. Vue+TypeScript学习

    Vue CLI 内置了 TypeScript 工具支持.在 Vue 的下一个大版本 (3.x) 中也计划了相当多的 TypeScript 支持改进,包括内置的基于 class 的组件 API 和 TS ...

  10. 3.实战HTML+CSS布局(实例入门篇)

    转自:https://www.cnblogs.com/hmyprograming/archive/2012/03/23/2414373.html 学习这篇入门教程我们假定你已经具有了一定的HTML基础 ...