WebApi深入学习--概述+路由查找
如何创建Controller这里就不说了,只写一些可能是高阶知识的内容
关于WebApi的官方介绍及示例 http://www.asp.net/web-api/
1.跨域
Asp.NET有专门的跨域扩展,需要通过nuget下载
然后webApiConfig中开启对CORS的支持
- public static class WebApiConfig
- {
- public static void Register(HttpConfiguration config)
- {
- config.EnableCors();
- /* ... */
- }
- }
最后是在想要支持跨域的Controller或Action上加上跨域支持特性 [EnableCors("*", "*", "*")]
上述代码只使用了特性的三个参数,先后是origins,headers,methods,用来限制来源和verb等相关信息。还可以通过设置SupportsCredentials,让凭据(Cookie)也可以发送到服务端
做了这些操作,就可以跨域获取数据了
2.生命周期
这里有一片关于WebApi生命周期的图文,相当不错 WEB API 2 HTTP消息生命周期
3.自动生成文档
有了Api自然就要有Api文档。
一般我们都是需要手动添加的,但是微软的WebApi提供自动生成WebApi文档功能 官方示例
如果创建的是MVC4以上的项目,帮助模板不需要用户自己创建,自动就会生成 路径是 /Areas/HelpPage
该帮助模块不仅可以通过IApiExplorer动态获取到所有WebApi(集成自ApiController的类)的相关信息:输入输出的数据注释、类型信息,而且还提供了不错的前端模板.
按照Controller分组显示Action列表
点击某个Action可以查看其详细信息,包括方法的Summary、字段介绍、返回数据的格式示例(根据返回数据类型动态生成)
HelpPages不仅可以随着新建项目自动生成,也可以手动添加到已存在的项目。
- 通过NuGet添加 Microsoft.AspNet.WebApi.HelpPage 到目标项目
- 将HelpPage区域注册到应用程序域
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- // ...
- }
- protected void Application_Start()
- 找到文件 /Areas/HelpPage/App_Start/HelpPageConfig.cs ,并取消下面这句代码的注释(默认这行代码是被注释掉的)
- config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));
- 打开该项目的属性窗口-》生成-》输出;将【XML文档文件】选中,输入框中填写 App_Data/XmlDocument.xml
注:除了用微软自带的HelpPage做自动文档生成,还可以选择强大的Swagger: Github,DEMO,http://blog.csdn.net/huwei2003/article/details/50501977
4.路由
4.1 路由模板
路由操作有三个阶段
- 根据Uri查找匹配的路由模板
- 查找Controller
- 查找Action
我们编写的路由存放在WebApiConfig.cs文件中,基本是这样子的
- routes.MapHttpRoute(
- name: "API Default",
- routeTemplate: "api/{controller}/{area}/{id}",
- defaults: new { id = RouteParameter.Optional,area="China" },
- constraints:new {id = @"\d+"}
- );
4.2 默认选项
其中 defaults: new { id = RouteParameter.Optional ,area="China"} 的作用
- 将id设为可选项,api/users/china/1 与 api/users/china 都匹配路由模板
- 为area设定默认值 即 api/users 等效于 api/users/area
此外还可以通过 constraints 为路由设定约束,例子中的条件是只有数字才会被匹配
当某个路由被匹配到了之后,就开始查找Controller和Action,
- 查找Controller:Web API 会添加"Controller" 到 {controller} 匹配的内容后面,如controller是user 则会寻找UserController.
- 查找Action:Web API会根据优先级进行查询,依次是 ①HTTP method;②以 HTTP method 开头的action.例如一个GET请求, Web API 会查找类似于 "GetContact" ,"GetAllContacts"的action. 这个转换只适用于 GET, POST, PUT, DELETE. 通过特性还可以支持其他 HTTP methods.
- 其他路由模板中的占位符变量, 例如 {id}会映射到Action方法中的参数.
4.3 路由字典
如果框架找到一个能够匹配URI的路由,会创建一个包含每一个占位符的字典。字典的键是占位符名称,
字典的值来源于URI匹配的路径或者模板中设置的默认值,然后字典会被存到IHttpRouteData对象中
4.4 选择Controller
控制器的选择是由IHttpControllerSelector.SelectController处理的。这个方法要输入一个HttpRequestMessage实例并返回一个HttpControllerDescriptor对象。具体的默认实现类是DefaultHttpControllerSelector,算法也比较简单:
- 在路由字典中查找键"controller"
- 在找到的值后面追加字符串“Controller”,以此获取控制器的类名
- 根据这个类名查找WebApi的控制器
- 如果没有匹配的类型,或者匹配到多个,则框架会向客户端返回错误
在第三步 DefaultHttpControllerSelector 使用IHttpControllerTypeResolver 接口来获取WebApi控制器的类型列表。IHttpControllerTypeResolver的默认实现会返回所有实现了IHttpController接口的公共类,并且不是虚类,类名以"Controller"为后缀。
4.5 选择Action
查找到Controller之后,框架通过调用IHttpActionSelector.SelectAction方法选择action(输入HttpControllerContext,返回HttpActionDescriptor)。
这个操作的默认实现是由类ApiControllerActionSelector提供,大体逻辑:
- 请求的HttpMethod
- 如果有的话,获取路由模板中的占位符"{action}"
- 控制器下action的参数
先了解一些关于action的事情
①controller类里面哪些方法会被认为是action?
当查找action时,框架只会筛选公共方法,并且还要排除掉特殊名称的方法(contructors,events,operator,overloads..),所在Controller要继承自ApiController类。
②关于Http Method
我们可以通过特性来制定action支持的Http Method:AcceptVerbs, HttpDelete, HttpGet, HttpHead, HttpOptions, HttpPatch,HttpPost, HttpPut.
- 如果没有指定HttpMethod特性,并且action方法名以"Get","Post","Put","Delete","Head","Option","Patch"开头,那么按照约定这个action这支持该Http method
- *如果没有符合上面两条,那么这个方法支持POST
③参数绑定 即WebApi通过请求为action方法的参数创建一个值;以下是参数绑定的默认规则:
- 简单类型(所有.NET的基本类型,DateTime,Decimal,Guid,String,TimeSpan)会从URI获取
- 复合类型从请求体(Request Body)获取,每一个action最多能从请求体获取一个参数
4.6 扩展点
Web API提供了路由过程中的一部分扩展点.
接口 | 作用 |
---|---|
IHttpControllerSelector | 选择 controller. |
IHttpControllerTypeResolver | 获取controller类型列表. DefaultHttpControllerSelector 从该列表中选择controller类型 |
IAssembliesResolver | 获取项目程序集列表. IHttpControllerTypeResolver通过该列表查找controller 类型. |
IHttpControllerActivator | 创建一个新的 controller 实例. |
IHttpActionSelector | 选择 action. |
IHttpActionInvoker | 调用 action. |
如果自己实现了上述某个接口的话,可以使用HttpConfiguration对象的Services集合.(Global.asax.cs)
- var config = GlobalConfiguration.Configuration;
- config.Services.Replace(typeof(IHttpControllerSelector), new MyControllerSelector(config));
翻译:
- http://www.asp.net/web-api
- http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection
WebApi深入学习--概述+路由查找的更多相关文章
- WebApi深入学习--特性路由
特性路由 WebApi2默认的路由规则我们称作基于约定路由,很多时候我们使用RESTful风格的URI.简单的路由是没问题的,如 api/Products/{id},但有些事很难处理的,如资源之间存在 ...
- webapi的学习资料
猿教程_-webapi教程-WebAPI教程 猿教程_-webapi教程-Web API概述 猿教程_-webapi教程-新建Web Api项目 猿教程_-webapi教程-测试Web API 猿教程 ...
- 《深入理解Linux网络技术内幕》阅读笔记 --- 路由查找
概述 1.不论是入口还是出口流量,都是利用fib_lookup来查找路由表,fib_lookup是对每一个路由表所提供的查找函数的包裹函数,当不支持策略路由时,查找函数版本针对的是local表和mai ...
- 利用nf_conntrack机制存储路由,省去每包路由查找
IP是无连接的,因此IP路由是每包一路由的,数据包通过查找路由表获取路由,这是现代操作协议协议栈IP路由的默认处理方式.可是假设协议栈具有流识别能力,是不是能够基于流来路由呢?答案无疑是肯定的. 设计 ...
- 利用systemtap学习Linux路由代码
http://bbs.chinaunix.net/thread-4090162-1-1.html 一.为什么要这样做读kernel route子系统代码,当我弄懂了数据结构之间的关系以及控制流程后,心 ...
- 基于TCAM 的高速路由查找
摘要 随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求.目前常见的硬件解决方案是采用TCAM实现关键词 TCAM,路由查找,最长前缀匹配. 1.引言 路由器转发IP 分组时,转发引擎需 ...
- C# WebApi使用AttributeRoutes特性路由
1.在创建WebApi中默认的路由规则,只能满足一般简单的RESTful风格,如 api/Products/{id}. 但是在实际运用中很难严格满足RESTful要求的WebApi.因此需要使用高版本 ...
- c语言学习笔记 - 顺序查找和哨兵查找比较
今天学习C时用到了顺序查找和哨兵查找,做了一个比较,主要是学习下哨兵查找法 例如在一个数组里查找一个元素,没找到返回-1,找到了则返回这个数组的下标也就是键值. 用循序查找法: void arr_se ...
- Django学习之路由分发和反向解析
原 Django学习之路由分发和反向解析 2018年07月12日 14:04:55 huangql517 阅读数 519 1>路由分发 我们之前学习的路由配置都是在项目的全局控制文件(项目名称目 ...
随机推荐
- SSH服务器与Android通信(1)--服务器端发送数据
很多应用要求SSH服务器不仅和PC通信,还要和Android移动设备通信,这时就需要用到JSON了.其基本原理是服务器将数据转换成JSON格式,发送给Android客户端,客户端再将JSON格式的数据 ...
- JWS ,JAX-WS ,JAX-RS,REST,Restlet,SOAP 相关概念
与 WebServices 相关的 J2EE 技术称为 JWS(Java WebServices),其中含有 JAX-WS.JAX-RS.JAXB.JAXR.SAAJ.StAX 等技术 支持 SOAP ...
- IOS高德地图逆地理编码定位+网络判断
先说下这功能的流程, 流程:判断用户是否联网--->获取用户地理位置经纬度--->通过经纬度去查询地理位置名称 //高德地图 @property (nonatomic, strong) ...
- Social Media POC KT Session
地址: 1. http://c0048925.itcs.hp.com:8080/datamining/report/brandfocus.html Social Media POC是针对Social ...
- CentOS 6.6 新安装系统的网络IP配置
实例环境 虚拟机:VMware 11.1.0 系统:CentOS 6.6 # ifconfig -a << 查看所有网卡的状态 2. # vi /etc/sysconfig/n ...
- 第2章 如何构建布局良好的Windows程序
01.菜单栏(MenuStrip) 设置快捷键方式: 方式一:1.设置菜单项的Text属性为(打开(&F)), 首先必须按住alt+主菜单快捷键进入到对应的主菜单, 然后直接按F就可以打开子窗 ...
- java集合-LinkedList
一.概述 LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现. ...
- IOS 非常流畅的滑动tableView
为什么要写这篇文章呢?之前写过一篇,因为手机打字不是很方便,还有之前同事用6splus 定下午茶时候,我滑动列表时候竟然误以为是安卓系统的手机. tableview 流畅度可以用fps来测试,到6 ...
- Ionic 今天发布了Windows 桌面版的IDE Ionic Lab
Ionic简介: Ionic 是一个强大的 HTML5 应用程序开发框架,号称 Advanced HTML5 Hybrid Mobile AppFramework 是 AngularJS 移动端解决方 ...
- jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)
最近做了一个jquery图片查看的插件,目的是能精确查看图片的详情,插件支持图片旋转.放大.缩小.拖拽.缩略图显示,界面效果是按照window的qq查看图片功能写的,当然不尽相同. 具体功能: 1. ...