HTML5技术

[ASP.NET]谈谈REST与ASP.NET Web API - Never、C

字号+ 作者:H5之家 来源:博客园 2015-10-09 15:25 我要评论( )

13天的假期结束,赶紧回来充电了 本节目录 Web API简介 REST REST是REpresentational State Transfer的缩写,可以翻译成表现状态转换. REST是一种软件架构风格,与技术无关,但是大部分基于REST风格的Web服务都是基于HTTP的 (虽然WCF在3.5以后支持REST,但是WCF

13天的假期结束,赶紧回来充电了

 

本节目录

 

Web API简介

REST

REST是“REpresentational State Transfer”的缩写,可以翻译成“表现状态转换”.

REST是一种软件架构风格,与技术无关,但是大部分基于REST风格的Web服务都是基于HTTP的

(虽然WCF在3.5以后支持REST,但是WCF太庞大了,Web API更适合做REST架构)

 

SOAP与REST

SOAP Web API采用RPC(面向方法Remote Procedure Call)风格,它采用面向功能的架构,所以在设计之初首先需要考虑的是提供怎样的功能。

RESTful Web API采用ROA(面向资源Resouce Oriented Architecture)架构,所以在设计之初首先需要考虑的是有哪些资源可供操作。

 

HTTP协议

HTTP采用简单的请求/响应模式的消息交换旨在实现针对某个Web资源的某种操作。

至于针对资源的操作类型,不外乎CRUD(Create、Retrieve、Update和Delete)而已。

一个HTTP请求除了利用URI标志目标资源之外,还需要通过HTTP方法指名针对资源的操作类型。

HTTP方法:包括GET(查)、POST(增)、PUT(改)、DELETE(删)、HEAD、OPTIONS、TRACE、CONNECTION和PATCH等

 

HTTP协议

GET HTTP/1.1 Host: neverc.cn Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.15 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie:

第1行是HTTP的3个基本属性,method,uri,vesion

其他都是HTTP的请求报头header,http定义很多原生的header,也可以添加自定义header(实际就是键值对)

除了报头,一个HTTP请求还可以包括一个请求主体内容,可以是任意格式.

 

与HTTP请求一样,HTTP响应也是由报头和报文2部分组成.

HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Vary: Accept-Encoding Server: Microsoft-IIS/7.5 X-AspNetMvc-Version: 5.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Fri, 18 Sep 2015 05:39:50 GMT Content-Length: 12003 <!DOCTYPE html>

第1行是vesion和statu(除了200 OK外,常见的有401 Not Authorized、404 Not Found)

第3行Content-Type表示媒体(或者叫资源/数据)类型.

 

自我寄宿

建立项目

涉及到的引用的程序集

 

创建实体

在Model项目中,新建一个Contact类

public class Contact { public string Id { get; set; } public string Name { get; set; } }

 

创建控制器

在WebApi项目中,引用System.Web.Http类库并创建API控制器

public class ContactsController : ApiController { #region Data static readonly List<Contact> contacts; static int counter = 2; static ContactsController() { contacts = new List<Contact> { new Contact{Id = "001",Name = "张三"}, new Contact{Id = "002",Name = "李四"} }; } #endregion public IEnumerable<Contact> Get(string id = null) { return from contact in contacts where contact.Id == id || string.IsNullOrEmpty(id) select contact; } public void Post(Contact contact) { //多线程并发处理 Interlocked.Increment(ref counter); contact.Id = counter.ToString("D3"); contacts.Add(contact); } public void Put(Contact contact) { contacts.Remove(contacts.First(c => c.Id == contact.Id)); contacts.Add(contact); } public void Delete(string id) { contacts.Remove(contacts.First(c => c.Id == id)); } }

 

自我寄宿

在SelfHost中,引用System.Web.Http、System.Net.Http、System.Web.Http.SelfHost类库并实现寄宿

static void Main(string[] args) { //对于SelfHost来说,HttpController类型的解析在默认情况下只会针对加载到当前应用程序域中的程序集列表 //通过手工加载,让该程序集加载到当前应用程序域中。 Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); var configuration = new HttpSelfHostConfiguration("http://localhost/selfhost"); using (var httpServer = new HttpSelfHostServer(configuration)) { httpServer.Configuration.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); httpServer.OpenAsync().Wait(); Console.WriteLine("寄宿Web API服务成功"); Console.Read(); } }

 

测试

运行SelfHost控制台,浏览器访问。

注意:(由于此处会注册http.sys,所以需要管理员身份运行VS)

 

 

IIS寄宿

使用IIS寄宿非常简单,只要注册好路由数据即可

 

建立项目

  • WebHost:一个空的Web项目(引用Model和WebApi项目)
  •  

    注册路由

    新建Global文件,注册HttpRoute

    public class Global : HttpApplication { protected void Application_Start(object sender, EventArgs e) { GlobalConfiguration.Configuration.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); } }

     

    测试

    运行WebHost项目,浏览器访问~/api/Contacts。

     

    调用Web API

    因为Web API是基于HTTP的,所以对于开发人员,就像普通请求网站数据一样

     

    这里演示一个HttpClient完整的例子,对于异步有疑问,可阅读我的博客:[C#] 谈谈异步编程async await

     

    新建一个控制台项目即可,实现Program类:

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 如何在 ASP.NET Core 中发送邮件 - Savorboard

      如何在 ASP.NET Core 中发送邮件 - Savorboard

      2017-05-02 08:02

    • 十二个 ASP.NET Core 例子 - Savorboard

      十二个 ASP.NET Core 例子 - Savorboard

      2017-04-27 16:01

    • ASP.NET MVC5请求管道和生命周期 - 雪飞鸿

      ASP.NET MVC5请求管道和生命周期 - 雪飞鸿

      2017-04-24 08:04

    • ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

      ASP.NET Core MVC 源码学习:详解 Action 的激活 - Savorboard

      2017-04-14 13:04

    网友点评
    (