如何创建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)也可以发送到服务端

做了这些操作,就可以跨域获取数据了

关于 CORS

2.生命周期

这里有一片关于WebApi生命周期的图文,相当不错 WEB API 2 HTTP消息生命周期

3.自动生成文档

有了Api自然就要有Api文档。

一般我们都是需要手动添加的,但是微软的WebApi提供自动生成WebApi文档功能 官方示例

如果创建的是MVC4以上的项目,帮助模板不需要用户自己创建,自动就会生成  路径是 /Areas/HelpPage

该帮助模块不仅可以通过IApiExplorer动态获取到所有WebApi(集成自ApiController的类)的相关信息:输入输出的数据注释、类型信息,而且还提供了不错的前端模板.

按照Controller分组显示Action列表

点击某个Action可以查看其详细信息,包括方法的Summary、字段介绍、返回数据的格式示例(根据返回数据类型动态生成)

HelpPages不仅可以随着新建项目自动生成,也可以手动添加到已存在的项目。

  1. 通过NuGet添加 Microsoft.AspNet.WebApi.HelpPage 到目标项目
  2. 将HelpPage区域注册到应用程序域
    protected void Application_Start()
    {
    AreaRegistration.RegisterAllAreas();
    // ...
    }
  3. 找到文件 /Areas/HelpPage/App_Start/HelpPageConfig.cs ,并取消下面这句代码的注释(默认这行代码是被注释掉的)
    config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));
  4. 打开该项目的属性窗口-》生成-》输出;将【XML文档文件】选中,输入框中填写 App_Data/XmlDocument.xml

注:除了用微软自带的HelpPage做自动文档生成,还可以选择强大的Swagger: GithubDEMO,http://blog.csdn.net/huwei2003/article/details/50501977

4.路由

4.1 路由模板

路由操作有三个阶段

  1. 根据Uri查找匹配的路由模板
  2. 查找Controller
  3. 查找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,算法也比较简单:

  1. 在路由字典中查找键"controller"
  2. 在找到的值后面追加字符串“Controller”,以此获取控制器的类名
  3. 根据这个类名查找WebApi的控制器
  4. 如果没有匹配的类型,或者匹配到多个,则框架会向客户端返回错误

在第三步 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

  1. 我们可以通过特性来制定action支持的Http Method:AcceptVerbs, HttpDelete, HttpGet, HttpHead, HttpOptions, HttpPatch,HttpPost,  HttpPut.

  2. 如果没有指定HttpMethod特性,并且action方法名以"Get","Post","Put","Delete","Head","Option","Patch"开头,那么按照约定这个action这支持该Http method
  3. *如果没有符合上面两条,那么这个方法支持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));

翻译:

WebApi深入学习--概述+路由查找的更多相关文章

  1. WebApi深入学习--特性路由

    特性路由 WebApi2默认的路由规则我们称作基于约定路由,很多时候我们使用RESTful风格的URI.简单的路由是没问题的,如 api/Products/{id},但有些事很难处理的,如资源之间存在 ...

  2. webapi的学习资料

    猿教程_-webapi教程-WebAPI教程 猿教程_-webapi教程-Web API概述 猿教程_-webapi教程-新建Web Api项目 猿教程_-webapi教程-测试Web API 猿教程 ...

  3. 《深入理解Linux网络技术内幕》阅读笔记 --- 路由查找

    概述 1.不论是入口还是出口流量,都是利用fib_lookup来查找路由表,fib_lookup是对每一个路由表所提供的查找函数的包裹函数,当不支持策略路由时,查找函数版本针对的是local表和mai ...

  4. 利用nf_conntrack机制存储路由,省去每包路由查找

    IP是无连接的,因此IP路由是每包一路由的,数据包通过查找路由表获取路由,这是现代操作协议协议栈IP路由的默认处理方式.可是假设协议栈具有流识别能力,是不是能够基于流来路由呢?答案无疑是肯定的. 设计 ...

  5. 利用systemtap学习Linux路由代码

    http://bbs.chinaunix.net/thread-4090162-1-1.html 一.为什么要这样做读kernel route子系统代码,当我弄懂了数据结构之间的关系以及控制流程后,心 ...

  6. 基于TCAM 的高速路由查找

    摘要 随着路由器接口速率的提高,传统的软件路由查找机制已经不能满足要求.目前常见的硬件解决方案是采用TCAM实现关键词 TCAM,路由查找,最长前缀匹配. 1.引言 路由器转发IP 分组时,转发引擎需 ...

  7. C# WebApi使用AttributeRoutes特性路由

    1.在创建WebApi中默认的路由规则,只能满足一般简单的RESTful风格,如 api/Products/{id}. 但是在实际运用中很难严格满足RESTful要求的WebApi.因此需要使用高版本 ...

  8. c语言学习笔记 - 顺序查找和哨兵查找比较

    今天学习C时用到了顺序查找和哨兵查找,做了一个比较,主要是学习下哨兵查找法 例如在一个数组里查找一个元素,没找到返回-1,找到了则返回这个数组的下标也就是键值. 用循序查找法: void arr_se ...

  9. Django学习之路由分发和反向解析

    原 Django学习之路由分发和反向解析 2018年07月12日 14:04:55 huangql517 阅读数 519 1>路由分发 我们之前学习的路由配置都是在项目的全局控制文件(项目名称目 ...

随机推荐

  1. LeetCode123:Best Time to Buy and Sell Stock III

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  2. C语言文件方式输入与输出(最简洁方便实用的一种方式)

    freopen("inputfile.txt", "r", stdin); freopen("outputfile.txt", " ...

  3. 开始自学H5前端-第一天

    自从iOS工作丢了后 就萌生了自学这个想法 但是一直在纠结学哪一门语言好 我是计算机科学与技术专业的 其实对于我来说 学啥都算是有点基础的 但是被iOS坑惨了之后 就会不自觉的进行各个方向和前景分析 ...

  4. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  5. C#调用C和C++函数的一点区别

    最近做U800电话的二次开发,需要调用厂商的C函数库来打电话,后来想加入通话录音功能,但发现程序默认生产的WAV文件过大,又找了个WAV转MP3的C++函数库程序,出了点问题.下面是转MP3的程序接口 ...

  6. 多平台下Modbus通信协议库的设计(一)

    1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...

  7. 【自然框架】终于把源码弄到git上了。

    好久没写博客了,发现又从左面的排名里掉出去了. 说来惭愧,一直说是开源,但是源码一直没能放到git里面.原因是,不会用. 最近终于把git弄明白了.把源码都放进去了. 刚兴趣的话可以来看看. http ...

  8. Context.js 右键菜单

    ContextJS is a lightweight solution for contextual menus. Currently, there are two versions. The fir ...

  9. 8款适合乐队、歌手和音乐家免费 WordPress 主题

    这篇文章与大家分享8款适合乐队.歌手和音乐家免费 WordPress WordPress 音乐网站主题.WordPress 作为最流行的博客系统,插件众多,易于扩充功能.安装和使用都非常方便,而且有许 ...

  10. JavaScript学习05 定时器

    JavaScript学习05 定时器 定时器1 用以指定在一段特定的时间后执行某段程序. setTimeout(): 格式:[定时器对象名=] setTimeout(“<表达式>”,毫秒) ...