ASP.NET Web API中的Routing(路由)
[译]Routing in ASP.NET Web API
单击此处查看原文
本文阐述了ASP.NET Web API是如何将HTTP requests路由到controllers的。
如果你对ASP.NET MVC非常的熟悉,那你将感受到Web API routing与MVC routing是非常的相似的。主要的不同点在于Web API选择action的时候,使用的是HTTP method,并非URI path。当然,你也可以在Web API中使用MVC风格的routing。以下,本文将不出现任何ASP.NET MVC的相关知识。
Routing Tables
在ASP.NET Web API中,一个controller是一个类,用于处理HTTP requests。其中public方法被称为 action methods 。当Web API框架接收到一个request,它会将这条request路由到对应的一个action。
Web API框架使用了 route table 来决定调用哪一个action。Visual Studio项目模板为Web API创建了一个默认路由:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这条路由被定义在App_Start文件夹下的WebApiConfig.cs文件中。
关于WebApiConfig类的更多详情,参见Configuring ASP.NET Web API。
如果你托管了Web API服务,那么必须在HttpSelfHostConfiguration对象中直接设置好routing table。更多详情,参见Self-Host a Web API。
routing table中的每一个入口都包含了一个 route template 。Web API的默认route template是"api/{controller}/{id}"。在这个template中,"api"是不变的路径段,{controller}和{id}是两个占位符。
当Web API框架接受到了一个HTTP request,它会尝试将URI和route table中的route templates进行匹配。如果没有路由被命中,客户端将会收到一个404错误。
下面的URIs会匹配到默认路由:
/api/contacts
/api/contacts/1
/api/products/gizmo1
下面的URI无法进行匹配,因为它缺少了api段:
/contacts/1
注意:在api路由中使用"api"路径段的原因是为了避免跟ASP.NET MVC的路由撞在一起。这样你就可以将"/contacts"匹配到一个MVC controller,将"/api/contacts"匹配到一个Web API controller。当然咯,如果你不喜欢这种约定,你可以去修改默认route table。
一旦一个路由被匹配到,Web API就选择了对应的controller和action:
- 为了找到controller,Web API会将"Controller"添加到{controller}变量中。
- 为了找到action,Web API会根据HTTP method,去action里面找,直到找到一个名称由那个HTTP method开头action。例如,一个Get request,Web API会去找一个名为“Get...”的action,比如"GetContact"或"GetAllContacts"。这个约定只对GET、POST、PUT、DELETE方法。你可以在你的controller上使用特性来允许其他的HTTP method,后面会说到这一点。
- route template中的其他的占位符变量,比如{id},会映射到action的parameters(参数)。
现在看一个例子:
public class ProductsController : ApiController
{
public void GetAllProducts() { }
public IEnumerable<Product> GetProductById(int id) { }
public HttpResponseMessage DeleteProduct(int id){ }
}
下面是是一些可能的HTTP requests,以及将会被调用到的action。
| HTTP Method | URI Path | Action | Parameter |
|---|---|---|---|
| Get | api/products | GetAllProducts | (none) |
| Get | api/products/4 | GetProductById | 4 |
| DELETE | api/products/4 | DeleteProduct | 4 |
| POST | api/products | (no match) |
注意URI中 {id} 部分如果出现,将会被映射到action的 id 参数。在这个例子中,控制器定义了两个Get method,一个带有 id 参数,另一个没有参数。
同时,请注意Post request将会失败。因为控制器并没有定义一个"Post..."的方法。
Routing变化
上一节我们说到了ASP.NET Web API的基础routing机制。本节将会阐述其他的变化形式。
HTTP Methods
你可以使用HttpGet、HttpPut、HttpPost、HttpDelete特性为一个action显示指定HTTP method,用于替代原本的HTTP methods命名约定。
下面的例子中,FindProduct方法会被Get requests映射到:
public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {}
}
如果想要为一个action允许多个HTTP methods,或者除了Get、PUT、POST、DELETE之外的HTTP methods,你可以使用AcceptVerbs特性,它提供了一系列的HTTP methods。
public class ProductsController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { }
// WebDAV method
[AcceptVerbs("MKCOL")]
public void MakeCollection() { }
}
带有Action Name的Routing
通过默认route template,Web API使用HTTP method来选择调用哪个action。不过你也可以新建一个route,将action名字包含进URI中:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在这个route template中,{action} 参数对应controller中的action method名字。这种风格的routing,使用特性来指定允许哪一个HTTP methods。例如,假设你的代码是如下的写法:
public class ProductsController : ApiController
{
[HttpGet]
public string Details(int id);
}
在这种情况下,一个Get request:"api/products/details/1"将会映射到具体的方法。这种routing跟ASP.NET MVC的非常相似,并且可能也是适用于一个RPC-style API的。
你可以通过ActionName特性来重写action name。在下面的例子中,有两个actions会被"api/products/thumbnail/id"映射到。一个支持GET,另一个支持POST。
public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]
public HttpResponseMessage GetThumbnailImage(int id);
[HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id);
}
Non-Actions
为了防止一个方法被当做action来调用,可以使用NonAction特性。这个信号告诉框架此方法不是一个action,即使它匹配到了某一条路由规则。
// Not an action method.
[NonAction]
public string GetPrivateData() { ... }
其他
本文从全局阐述了routing。更多详情,参见Routing and Action Selection,它确切地阐述了框架如何去将URI匹配到route,再如何选择controller,最后如何选择一个action来调用。
ASP.NET Web API中的Routing(路由)的更多相关文章
- 【ASP.NET Web API教程】4.1 ASP.NET Web API中的路由
原文:[ASP.NET Web API教程]4.1 ASP.NET Web API中的路由 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. ...
- ASP.NET WEB API 中的路由调试与执行过程跟踪
路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- 在ASP.NET Web API中使用OData
http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...
- ASP.NET Web API中使用OData
在ASP.NET Web API中使用OData 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在ASP.NET Web API中,对于CRUD(creat ...
- ASP.NET Web API框架揭秘:路由系统的几个核心类型
ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...
- 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择
目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择 ASP.NET Web API能够根据请求激活目标HttpController ...
- ASP.NET Web API中实现版本的几种方式
在ASP.NET Web API中,当我们的API发生改变,就涉及到版本问题了.如何实现API的版本呢? 1.通过路由设置版本 最简单的一种方式是通过路由设置,不同的路由,不同的版本,不同的contr ...
- 在ASP.NET Web API中实现CORS(跨域资源共享)
默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...
随机推荐
- SSI框架总结
先来点文字性的描写叙述: MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,如今已被广泛应用.近年来,随着java的盛行,MVC的低耦合性.高重用 ...
- springmvc和servlet在上传和下载文件(保持文件夹和存储数据库Blob两种方式)
参与该项目的文件上传和下载.一旦struts2下完成,今天springmvc再来一遍.发现springmvc特别好包,基本上不具备的几行代码即可完成,下面的代码贴: FileUpAndDown.jsp ...
- leetcode[90] Decode Ways
题目:如下对应关系 'A' -> 1 'B' -> 2 ... ‘Z’ -> 26 现在给定一个字符串,返回有多少种解码可能.例如:Given encoded message &qu ...
- WinForm中回车键实现文本框之间的跳转
利用窗体的KeyPreView .设置KeyPreView = true 设置窗体的KeyPreView 属性为True后,那么窗体内的子控件响应KeyPress事件(或其他事件)之前,会先响应窗体的 ...
- String.Join的实现
String.Join的实现 在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的 ...
- Linux内核编译和运行
内核获取网站:https://www.kernel.org/pub/linux/kernel/ 步骤如下: 1.打开终端,更改用户权限为root.具体做法是在终端输入sudo su,然后按提示输入 ...
- Day2:T1搜索 T2最小生成树
T1:广搜+判断矩形 注:如何判断搜的是否为矩形: 在广搜的时候,记录下边界的坐标,然后枚举一遍过去,如果搜到"."就是牛群,否则就是房间 瞥了一眼ccy的做法,据说是floodf ...
- Asp.net MVC集成Google Calendar API(附Demo源码)
Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...
- SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)
挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面) 这个工具主要就是自动备份数据库,一键还原数据库,发送备份数据库日志报告到邮箱,自动压缩备份好的数据库 定期执行数 ...
- js中的AMD规范
回首萧瑟,残月挂角,孤草弄影. 看了一下上一篇随笔的日期,距离上一篇日志又过去了许久.在这段时间中,我尽全力去拯救那间便利店,可惜到最后依然失败,这一次是所有的出路全部没有了,我也做了所有的努力.闲下 ...