ASP.NET Web API 2.0学习笔记

ASP.NET Web API 2.0学习笔记

概述

ASP.NET Web API是一个独立于传输层的抽象消息处理管道,它能根据请求采用 HTTP方法来确定目标 Action方法。
IIS 默认拒绝PUTDELETE请求,原因是默认注册了 WebDAVModule,可以通过配置文件移除HttpModule

** Web API的宿主方式**
1,web host 方式
以 Web Host的 方式寄宿 Web API需 要做的唯——件事情是路 由注册。

2,self host 方式
任意类型的应用程序 (控制台、Windows Forms应 用、WPF应用甚至是 Windows sewioc)作为宿主。
除了必须的路 由注册外,我们还需要完成额外的一件事情,即手工加载定义了HttpController类型的程序集。

路由

ASP.NET路由系统

一个Web 应用具有一个全局的路由表,通过 System.Web.Routing.RouteTable的静态属性Routes表示。

RouteBase

一个Route继承抽象类System.Web.Routing.RouteBase

RouteData

VirTalPathData

Route
System.Web.Routing.Route是抽象类System.Web.Routing.RouteBase唯一的直接子类,基于路由模版模式的路由匹配规则就定义在Route中。

RouteTable

ASP.NET WEB API 路由

请求与响应

ASP.NET WEB API通过类型HttpRequestMessageHttpResponseMessage表示的管道处理的请求和响应的消息,定义在System.Net.Http.dll中。

HttpRequestMessage

HttpResponseMessage

HttpContent

ASP.NET WEB API 路由系统

ASP.NET WEB API路由系统中HostedHttpRoute对象通过创建ASP.NET路由系统中的HttpWebRoute对象进行路由解析。
针对约束的检查则依然是ASP.NET WEB API路由系统中的HttpRouteConstraint

Web Host宿主模式采用的route类型为HttpWebRoute,对应的RouteHandlerHttpControllerRouteHandler对象,提供的HttpHandler类型为HttpControllerHandler

ASP.NET WEB API以Web Host模式部署并注册相应的路由后,这些注册的HttpRoute(HostedHttpRoute)最终会转换成asp.net全局路由表中的Route(HttpWebRoute)
asp.net路由系统对请求进行拦截,如果匹配某个Route,响应的路由数据
被解析出来并保存在RequestContext中,随后asp.net路由系统的实现者
UrlRoutingModule从匹配的Route中获取RouteHandler,即HttpControllerRouteHandler对象,该对象提供HttpHandler(HttpControllerHandler)被映射到当前请求。
一旦映射成功,HttpControllerHandler将最终接管当前请求,它会构建一个
消息处理管道来处理这个请求并对请求予以响应。

HttpControllerHandler创建HttpRequestMessage,并将ASP.NET路由系统解析得到的RouteData转换成HttpRouteData,并添加到HttpRequestMessage属性的字典中。

HttpRouteData

HttpVirtualPathData

HttpRouteConstraint

HttpRoute

HttpRouteCollection

HostedHttpRoute
可以看成一个对Route对象的封装。

消息处理管道

ASP.NET WEB API的核心框架是一个消息处理管道,由一组HttpMessageHandler的有序组合。

1, HttpMessageHandler
ASP.NET WEB API的核心框架是一个消息处理管道,由一组HttpMessageHandler经过收尾相连而成。

2,DelegatingHandler

管道的串联通过DelegatingHandler来完成。

3,HttpServer

作为HttpMessageHandler链的龙头

4,HttpRoutingDispatcher

消息处理管道最后一个HttpMessageHandler.
主要功能:路由(Routing)和消息分发(Dispatching)
默认从HttpRoutingDispatcher接管请求的HttpMessageHandlerHttpControllerDispatcher对象。对HttpController的激活和Action方法的执行和响应都是有HttpControllerDispatcher完成的。

Web Host模式下消息处理管道

HttpControllerHandler

HttpControllerHandler创建HttpRequestMessage,并将ASP.NET路由系统解析得到的RouteData转换成HttpRouteData,并添加到HttpRequestMessage属性的字典中。

Self Host模式下消息处理管道

HttpController的激活

HttpController

HttpRoutingDispatcher会利用隶属于它的HttpControllerDispatcher激活目标HttpController对象。

1,HttpControllerContext

HttpController对象ExecuteAsync方法得到HttpControllerContext

2,HttpControllerDescripor

HttpControllerDescriptor封装了某个HttpController类型的元数据,即HttpController类型的描述对象。

创建HttpController

HttpController如何创建的

HttpControllerDispatcher实现目标HttpController对象的激活与执行,并将代表执行结果的HttpResponseMessage对象返回给HttpRoutingDispatcher对象,后者将HttpResponseMessage回传给消息管道进行相应的处理后最终完成对请求的响应。

HttpControllerDispatcher接管请求后,它会获取注册的HttpControllerSelector对象,默认注册的HttpControllerDescriptor 是一个DefaultHttpControllerSelector,后者借助于注册的HttpControllerTypeResolver对象得到所有的HttpController类型,进而创建一个描述这些HttpControllerHttpControllerDescriptor对象与HttpController名称之间的映射关系,并调用其SelectController方法 得到描述目标HttpControllerHttpControllerDescriptor对象。

HttpControllerDispatcher接下来调用这个HttpControllerDescriptor对象的CreateController方法得到激活的HttpController对象。对于这个HttpControllerDescriptor对象来说,当它CreateController方法被调用之后,它会获取注册的HttpControllerActivator对象,并调用其Create方法实现针对目标HttpController对象的激活并将激活的对象返回。

默认注册的DefaultHttpControllerActivator对象会利用注册的DependencyResolver根据HttpController类型去获取代表目标HttpController实例的对象。如果后者返回一个HttpController对象,该对象将直接作为方法的返回值,否则DefaultHttpControllerActivator直接采用反射的形式创建目标HttpController对象并返回。

由于默认注册的DepandencyResolver是一个EmptyResolver对象,由它返回HttpController对象总是null,所以在默认情况下激活HttpController对象总是以反射的形式创建的。所以我们定义HttpController类型必须具有一个默认的构造函数。

Action的选择

HttpActionDescriptor

HttpActionDescriptor是一个抽象类。

定义在HttpController类型中的每一个Action方法都是通过HttpActionDescriptor对象来描述的。描述Action方法的基本元数据信息均可以在对应的HttpActionDescriptor对象中找到。

ReflectedHttpActionDescriptor

HttpActionDescriptor是一个抽象类,默认实现是ReflectedHttpActionDescriptor对象,通过对目标方法实施反射来获取相关的元数据信息。
一个ReflectedHttpActionDescriptor对象是对一个MethodInfo的封装,
描述Action方法相关的元数据基本来源于此。

ActionNameAttribute

应用ActionNameAttribute特性来对Action进行命名。

方法名决定HTTP方法

如果Action方法具有以下的前缀(不区分大小写),那么对应的HTTP方法将默认支持。不具有,则默认支持POST。

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD
  • OPTIONS
  • PATCH

ActionHttpMethodProvider

ActionHttpMethodProvider应用到某个Action方法上,并为其提供它所支持的HTTP方法。

AcceptVerbsAttribute特性

写法:

1
[AcceptVerbsAttribute("PUT","POST")]

ASP.NET Web API 定义的7中对应的特性类型:

1
2
3
4
5
6
7
HttpGetAttribute
HttpPostAttribute
HttpPutAttribute
HttpDeleteAttribute
HttpHeadAttribute
HttpOptionsAttribute
HttpPatchAttribute

HttpParameterDescriptor

抽象类,用户描述Action方法参数的HttpParameterDescriptor对象。

ReflectedHttpParameterDescriptor

HttpActionSelector

使用ApiControllerActionSelector对象作为默认的HttpActionSelector

特性路由

参考:

[ASP.NET Web API 2 框架揭秘](ASP.NET Web API 2 框架揭秘)