概述

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. ajax事件(五)

    建立和探索一个简单示例之后,现在可以深入了解XMLHttpRequest对象支持的功能,以及如何在你的请求中使用它们了.起点就是第二级规范里定义的那些额外事件.之前已经使用一个:readystatec ...

  2. 解决create-react-app 后 npm start 中出现 的webpack版本问题和webpack-dev-server的版本问题

    利用VSCode搭建react的脚手架运行环境的时候.create-react-app之后npm start出现如下图的问题: There might be a problem with the pr ...

  3. PHP截取字符串长度

    <?php function str_cut($string, $start=0,$length, $dot = '..') {    $strlen = strlen($string);    ...

  4. sql查看依赖关系

    select OBJECT_NAME(object_id) as name,object_NAME(referenced_major_id) as ref from sys.sql_dependenc ...

  5. sql跳过非工作日(周末和节假日)

    简介:场景1:基于开始日期和工期,推算结束日期. 场景2:基于开始日期和结束日期,计算工期 注:需要自己做界面维护工作日表(s_WorkDay)和节假日表(s_SpecialDay) 涉及到的数据表 ...

  6. secureCRT The remote system refused the connection问题解决

    问题: Ubuntu系统必须开启ssh服务后,XP或者其它的主机才干够远程登陆到Ubuntu系统. 1,安装软件包,运行sudo apt-get install openssh-server Ubun ...

  7. Google Web Toolkit(GWT) 在windows下环境搭建

    1.什么是GWT? Google Web Toolkit(简称GWT,读作/ˈɡwɪt/),是一个前端使用JavaScript,后端使用Java的AJAX framework,以Apache许可证2. ...

  8. linux又一次编译安装gd,添加freetype支持,解决验证码不显示问题,Fatal error: Call to undefined function imagettftext()

    问题: Fatal error: Call to undefined function Think\imagettftext() in /var/www/webreg/ThinkPHP/Library ...

  9. 20款PHP版WebMail开源项目

    20款PHP版WebMail开源项目 如今互联网巨头提供的企业应用套件中邮件托管是必备服务,而且还始终秉承免费的优良光荣传统,最为让人熟识的恐怕非"瘟多死里屋管理中心"和" ...

  10. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...