ASP.NET Web API 2.0学习笔记
ASP.NET Web API 2.0学习笔记
概述
ASP.NET Web API是一个独立于传输层的抽象消息处理管道,它能根据请求采用 HTTP方法来确定目标 Action方法。
IIS 默认拒绝PUT和DELETE请求,原因是默认注册了 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
RouteSystem.Web.Routing.Route是抽象类System.Web.Routing.RouteBase唯一的直接子类,基于路由模版模式的路由匹配规则就定义在Route中。
RouteTable
ASP.NET WEB API 路由
请求与响应
ASP.NET WEB API通过类型HttpRequestMessage和HttpResponseMessage表示的管道处理的请求和响应的消息,定义在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,对应的RouteHandler是HttpControllerRouteHandler对象,提供的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接管请求的HttpMessageHandler是HttpControllerDispatcher对象。对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类型,进而创建一个描述这些HttpController的HttpControllerDescriptor对象与HttpController名称之间的映射关系,并调用其SelectController方法 得到描述目标HttpController的HttpControllerDescriptor对象。
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 | [] |
ASP.NET Web API 定义的7中对应的特性类型:
1 | HttpGetAttribute |
HttpParameterDescriptor
抽象类,用户描述Action方法参数的HttpParameterDescriptor对象。
ReflectedHttpParameterDescriptor
HttpActionSelector
使用ApiControllerActionSelector对象作为默认的HttpActionSelector。
特性路由
参考:
[ASP.NET Web API 2 框架揭秘](ASP.NET Web API 2 框架揭秘)