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 ...
随机推荐
- 机器学习学习-Types of learning
Types of learning 基于个人理解.于我们在面对一个详细的问题时.可以依据要达到的目标选择合适的机器学习算法来得到想要的结果.比方,推断一封电子邮件是否是垃圾邮件,就要使用分类(clas ...
- Fluent Validation
.NET业务实体类验证组件Fluent Validation 认识Fluent Vaidation. 看到NopCommerce项目中用到这个组建是如此的简单,将数据验证从业务实体类中分离出来,真 ...
- SQL Server 复制 - 发布订阅(SQL Server 数据同步)
原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布 ...
- String.Join的实现
String.Join的实现 在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的 ...
- WCF、Web API、WCF REST、Web Service 区别
Web Service It is based on SOAP and return data in XML form. It support only HTTP protocol. It is no ...
- SpringMVC格式化显示
SpringMVC学习系列(7) 之 格式化显示 在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候 ...
- 基于嵌入式OS的任务设计-----任务划分
在<前后台系统VS嵌入式OS,何时该上OS?>一文中介绍了何时应该将OS应用于嵌入式设计中,本文将介绍基于OS的任务设计,一般来说,应用程序设计包括两个方面,一个是业务逻辑的设计,另一个是 ...
- net破解一(反编译,反混淆-剥壳,工具推荐)
net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...
- GNU 项目(开源社区的由来,背后的哲学)
转自译言网:http://article.yeeyan.org/view/88497/59257/ 第一个软件共享社区 当我在1971年开始在麻省理工人工智能实验室工作时, 我成为一个已经存在多年的软 ...
- What skills are needed for machine learning jobs
What skills are needed for machine learning jobs?机器学习工作必须技能 原文: http://www.quora.com/Machine-Learnin ...