目录

1 快速入门

入门最好的资料就是看官方的文章介绍和实例,以获得最新的知识的更新。

当然,还有国人翻译的http://aehyok.com/Blog/Detail/67.html

1.1实例

1.1.1初识WEB API 2

http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

和WEB API 相比,结构上大致没什么区别。

1.1.2 Action Results 的改变

http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results

在原有的基础上新增了异步处理机制,对应不同的IHttpActionResult的具体实现。

  • void
  • HttpResponseMessage
  • IHttpActionResult(WEB API 2新增)
  • Some other type

1.1.2.1 IHttpActionResult

IHttpActionResult 定义一个用于以异步方式创建 System.Net.Http.HttpResponseMessage 的命令的借口。

在System.Web.Http.Results命名空间(System.Web.Http.dll)下,可以找到一些常用的IHttpActionResult的实现,异步创建不同HttpStatusCode的HttpResponseMessage。

1.1.2.2 ApiController

ApiController类中,也同时也对应新增了返回IHttpActionResult子类的快捷方法,如OK()方法,会返回OKResult对象等。当然,我们也可以自定义实现IHttpActionResult,满足不同的HttpStatusCode的需要。

1.1.3 路由的新增特性

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

http://www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing

通过新增的RoutePrefixAttribute、RouteAttribute 、IHttpRouteConstraint,可以灵活的配置不同层次的路由及其路由约束,通过直接对外暴露API(无需匹配WebApiConfig里的routetemplate),以满足不同场景下的需要。

1.1.3.1 RoutePrefixAttribute

1.1.3.2 RouteAttribute

1.1.3.3 IHttpRouteConstraint

在System.Web.Http.Routing.Constraints命名空间下,默认提供了一系列的路由约束IHttpRouteConstraint的具体实现,如AlphaRouteConstraint、DateTimeRouteConstraint等。

当然,可以通过自定义路由约束,实现路由匹配。自定义的IHttpRouteConstraint,为了能运行自定义的IHttpRouteConstraint,必须先进行注册,通过HttpConfiguration.MapHttpAttributeRoutes来注册新的特性路由解析器

1.1.3.4 DefaultInlineConstraintResolver

1.1.4 消息管道的变化

1.1.4.1 HttpMessageHandler

1.1.4.2 DelegatingHandler

1.1.4.3 HttpServer

HttpRoutingDispatcher

1.2 了解更多

1.2.1 MSDN

MSDN关于WEB API 2各个方面的官方指导

https://msdn.microsoft.com/zh-cn/library/dn448365(v=vs.108).aspx

1.2.2 HTTP Message Lifecyle

WEB API 2中独立于IIS的消息管道是其整个核心,其整个消息生命周期在该PDF里有非常详细的说明,从图中可以看到在整个消息生命周期里可以自定义扩展的地方,这个是非常重要的,值得关注的。

http://www.asp.net/media/4071077/aspnet-web-api-poster.pdf

http://www.asp.net/web-api/overview/advanced/http-message-handlers

HttpRequestMessage

在System.Net.Http.dll中的HttpRequestMessage类,是对一个实际的HTTP 请求消息(HTTP请求报文)的包装。

HttpRequestMessage包含了HttpContent、HttpHeaders、HttpMethod和Version这几个类型的属性来对应HTTP请求报文的报文主题,报头,HTTP方法和HTTP协议版本(默认http 1.1版本)

还有一个public IDictionary<string, object> Properties { get; }的属性,HTTP 请求的属性集,是非常重要的。在Web API 中,是不存在HttpContext上下文对象的,而类似的上下文对象会被存储在该Properties 属性对象里,还有,RouteData也是。

MS内置的键值主要都在System.Web.Http.Hosting.HttpPropertyKeys类的字段列表中。

HttpRequestContext

这个类就是类似ASP.NET中的HttpContext的类型,在整个消息处理链中,通过存储在前面的HttpRequestMessage对象的Properties的属性列表里,我们可以在消息处理链中的任一Handler中来获取这一上下文对象,通过System.Web.Http.Hosting.HttpPropertyKeys类的键值名称和System.Net.Http.HttpRequestMessageExtensions静态类的多种扩展方法来方便我们访问不同的属性对象。

HttpServer

根据PDF周期里的图所示,由于HttpServer是整个消息处理链的头(HttpMessageHandler链),于是好奇HttpServer是如何被创建的。查看了源码,分2种情况,一种是基于WebHost,另一种基于SelfHost。分别对应的GlobalConfiguration(System.Web.Http.WebHost.dll的System.Web.Http命名空间下)类和WebApiAppBuilderExtensions(System.Web.Http.Owin.dll的Owin命名空间下),可以找到创建HttpServer相关的代码。不过在System.Web.Http.SelfHost.dll 中存在一个HttpSelfHostServer,继承HttpServer的子类。

HttpServer的Initialize方法中,调用 InnerHandler = HttpClientFactory.CreatePipeline(_dispatcher, _configuration.MessageHandlers);来生成整个管道,自此,整个消息管道的头HttpServer、尾HttpRoutingDispatcher和以及整个链HttpMessageHandlers就准备好了。

从静态方法HttpClientFactory.CreatePipeline可以明显看到,整个消息处理HttpMessageHandler列表通过其innerHandler串联起来,成为消息处理链。

HttpRoutingDispatcher

整个消息处理链的尾部,系统自动创建,直接继承HttpMessageHandler,而非DelegatingHandler,通过其SendAsync方法可以发现HttpRequestMessage对象的IHttpRouteData类型的RouteData属性的获取,主要是通过其public IDictionary<string, object> Properties { get; }属性,指定键值获取的。

protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

{

// Lookup route data, or if not found as a request property then we look it up in the route table

IHttpRouteData routeData = request.GetRouteData();

if (routeData == null)

{

routeData = _configuration.Routes.GetRouteData(request);

if (routeData != null)

{

request.SetRouteData(routeData);

}

}

  //...

}

从以上的HttpRoutingDispatcher的SendAsync方法代码可以看出,HttpRoutingDispatcher只是一个代理的作用,不做实际的消息处理,

但是会进行路由的匹配,从而找到对应的IHttpRoute对象,并通过调用IHttpRoute对象的Handler属性(HttpMessageHandler类型)来执行最终的消息处理,如果该Handler不存在,则使用HttpRoutingDispatcher类中默认的一个HttpMessageHandler类型的实例defaultHandler来接管处理。

这个defaultHander实际上是HttpControllerDispatcher类型的,同样是直接继承了HttpMessageHandler抽象类,在其重载方法SendAsync中,会创建根据当前路由来创建最映射到的IHttpController对象实例,最终映射到其方法,返回一个请求HttpMessageResponse对象.

HttpControllerDispatcher

该对象是最终Controller选择调度的地方,同时生成HttpControllerContext控制器上下文对象和HttpControllerDescriptor对象,最后执行找到的IHttpController对象的ExecuteAsync方法。

如果该IHttpController创建失败,直接返回NotFound的HttpMessageResponse消息响应对象。

可以看出,HttpControllerDescriptor.CreateController(request)是实际创建IHttpController对象实例的方法。

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpControllerContext controllerContext = null; //...
HttpControllerDescriptor controllerDescriptor = ControllerSelector.SelectController(request); //...
IHttpController controller = controllerDescriptor.CreateController(request); //...
controllerContext = CreateControllerContext(request, controllerDescriptor, controller);
return await controller.ExecuteAsync(controllerContext, cancellationToken);
}

HttpControllerContext

HttpControllerDescriptor

让我们看看HttpControllerDescriptor到底是如何创建最终匹配的IHttpController的,追朔到具体的代码,IHttpControllerActivator,看名字应该是一个根据具体的Controller的Type类型,通过反射创建IHttpController实例的类。

public virtual IHttpController CreateController(HttpRequestMessage request)
{
if (request == null)
{
throw Error.ArgumentNull("request");
} // Invoke the controller activator
IHttpControllerActivator activator = Configuration.Services.GetHttpControllerActivator();
IHttpController instance = activator.Create(request, this, ControllerType);
return instance;
}

DefaultHttpControllerActivator

追根溯源,到底IHttpController是在哪里生成的,继续在HttpControllerDescriptor.CreateController的方法里查找,

在命名空间System.Web.Http.Dispatcher下,有DefaultHttpControllerActivator类,继承IHttpControllerActivator接口,

因为是用到反射创建Controller,理所当然,有个缓存的私有属性private Tuple<HttpControllerDescriptor, Func> _fastCache;来尽量减少放射的次数。

1.3 OWIN

我们可以使用OWIN 自宿主(SelfHost) ASP.NET WebAPI 2应用。

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

//TODO

1.4 获取MS的知识更新

channel9会时常更新新的技术教程,正巧发现这2天有WEB API Design的视频更新,目前有6集。

http://channel9.msdn.com/Series/Web-API-Design/01

2.进阶

2.1 通过WEB API 2的源码学习

通过源码学习是最好的方式

http://aspnetwebstack.codeplex.com/

2.2 优秀开源项目的学习

//TODO

3 实际开发

3.1 WCF and ASP.NET Web API

WCF和WEB API的抉择

https://msdn.microsoft.com/en-us/library/jj823172.aspx

3.2 WP移动开发

移动开发是目前整个开发的趋势,迫切地需要开始有针对性的在移动开发方面做一些实践。同时WEB API 又非常适合移动端的数据交互。

要注意的是,必须在window 8操作系统下, 才可以开发WP8.0+应用。

http://www.asp.net/web-api/overview/mobile-clients/calling-web-api-from-a-windows-phone-8-application

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-windows-store-dotnet-leaderboard/?WT.mc_id=zumo_aspnet&rnd=1

http://blogs.msdn.com/b/webdev/archive/2013/07/19/writing-web-api-client-code-for-multiple-platforms-using-portable-libraries.aspx

3.3 WEB API与SignalR

Web API与SignalR一起同为构建Service的框架。Web API负责构建http常规服务,而SingalR主要负责的是构建实时服务,例如股票,聊天室,在线游戏等实时性要求比较高的服务。

[整理]ASP.NET WEB API 2学习的更多相关文章

  1. ASP.NET Web API(C#)学习01

    Web Api 记得去年公司有个分享会分享了这个,最近留意招聘信息的时候,发现有个招聘信息的要求是会用WebApi,然后花了半个小时不到,根据下面这篇文章了解了一下,觉得这个东西也不难啊. 突然发现在 ...

  2. 转载 ASP.NET Web API 学习

    转载关于ASP.NET Web API 的学习网址 http://www.cnblogs.com/aehyok/p/3432158.html http://www.mashangpiao.net/Ar ...

  3. 新作《ASP.NET Web API 2框架揭秘》正式出版

    我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...

  4. ASP.NET Web API 2框架揭秘

    ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...

  5. Self-Host c#学习笔记之Application.DoEvents应用 不用IIS也能執行ASP.NET Web API

    Self-Host   寄宿Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台.Windows Forms 应用.WPF 应用甚至是Wind ...

  6. 学习ASP.NET Web API框架揭秘之“HTTP方法重写”

    最近在看老A的<ASP.NET Web API 框架揭秘>,这本书对于本人现阶段来说还是比较合适的(对于调用已经较为熟悉,用其开发过项目,但未深入理解过很多内容为何可以这样“调用”).看到 ...

  7. ASP.NET Web API 学习【转】

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...

  8. 【ASP.NET MVC 学习笔记】- 20 ASP.NET Web API

    本文参考:http://www.cnblogs.com/willick/p/3441432.html 1.ASP.NET Web API(本文简称Web API),是基于ASP.NET平台构建REST ...

  9. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

随机推荐

  1. Linux shell(5)

    shell程序流程控制的三大结构: 1. 顺序结构 2.选择结构 3.循环结构 顺序结构的定义: 顺序结构的程序设计是最简单的一种结构,它的执行顺序自上而下,依次执行,因此,我们只要按照解决问题的思路 ...

  2. 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]

    --------------------- 作者:吴潇雄 来源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/835118 ...

  3. 《Pro SQL Server Internals, 2nd edition》中CHAPTER 7 Designing and Tuning the Indexes中的Clustered Index Design Considerations一节(译)

    <Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59 ...

  4. PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789220.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  5. 结巴分词python

    将文件中的txt文档依次读出 并分好词后 写入 另外的TXT中 #coding=utf-8 import os import jieba import codecs import random def ...

  6. python 安装多个包/pip用法

    列出已安装的包 pip freeze or pip list 导出requirements.txt pip freeze > <目录>/requirements.txt 安装包 在线 ...

  7. Java运算符、switch、数组、排序

    1.Java的运算符,分为四类:算数运算符.关系运算符.逻辑运算符.位运算符 运算符例子:22.25(十进制转化为二进制,8421码)0010 0010 (22)0010 0101 (25) 位运算符 ...

  8. Daily Scrum - 12/04

    Meeting Minutes 与Qiufeng, Bojie, Zhongqiu, Ran, Travis一起讨论. 确定了最后的UI及Feature. 开始Code Review, 以及有计划的M ...

  9. 弟三周作业之VS2015

    这周有个任务就是安装VS2015,然后进行简单的单元测试. 首先我上吴小勇同学给的MSDN官网(http://www.itellyou.cn/)下载VS2013, 然后装上后,在工具栏里,点击工具里的 ...

  10. 关于给C盘扩容以及动态磁盘

    2019.4.5 周五 磁盘分为基本磁盘和动态磁盘 基本磁盘转动态磁盘是很容易的 https://jingyan.baidu.com/article/59a015e3a3d504f7948865b1. ...