ASP.NET Web API中的路由
ASP.NET Web API的默认路由在App_Start目录中的WebApiConfig.cs文件中定义的。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
路由表中的每个条目都包含一个路由模板。Web API的默认路由模板是“api / {controller} / {id}”。在此模板中,“api”是文字路径段,{controller}和{id}是占位符变量。
当Web API框架收到HTTP请求时,它会尝试将URI与路由表中的某个路由模板进行匹配。如果没有路由匹配,则客户端收到404错误。
找到匹配的路由后,Web API将选择控制器和操作:
- 要查找控制器Controller,Web API会将“Controller”添加到{controller}变量的值中。
- 要查找操作方法action,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。例如,对于GET请求,Web API会查找以“Get ...”开头的操作,例如“GetContact”或“GetAllContacts”。此约定仅适用于GET,POST,PUT和DELETE方法。
- 路径模板中的其他占位符变量(例如{id})将映射到操作参数。
按操作名称路由
使用默认路由模板,Web API使用HTTP方法选择操作。但是,您也可以创建一个路径,其中操作名称包含在URI中:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在此路由模板中,{action}参数在控制器上命名操作方法。使用此样式的路由,使用属性指定允许的HTTP方法。
public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]//使用ActionName属性覆盖操作名称
public HttpResponseMessage GetThumbnailImage(int id); [HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id); //非操作:要防止将方法作为操作调用,请使用NonAction属性。这向框架发出信号,表明该方法不是动作,即使它与路由规则匹配。
// Not an action method.
[NonAction]
public void DeleteThumbnailImage(int id);
}
路由有三个主要阶段:
- 将URI与路由模板匹配。
- 选择一个控制器。
- 选择一个动作。
路由模板:Route Templates
1、路由模板类似于URI路径,但它有占位符值,用花括号表示,其中 占位符匹配任何值。
"api/{controller}/{category}/{id}"
2、创建路径是,可以部分或者全部为占位符提供默认值:
defaults: new { category = "all" }
3、还可以提供约束,用以约束现在URI段与占位符匹配的方式:
constraints: new { id = @"\d+" } // Only matches if "id" is one or more digits.
默认
如果提供默认值,则路由将匹配缺少这些段的URI。例如:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{category}",
defaults: new { category = "all" }
);
URI“http://localhost/api/products
”匹配此路由。“{category}”段被分配了默认值“all”。
Route Dictionary
如果框架找到URI的匹配项,它将创建一个包含每个占位符的值的字典。键是占位符名称,不包括花括号。值来自URI路径或默认值。字典存储在IHttpRouteData对象中。
在此路由匹配阶段,特殊的“{controller}”和“{action}”占位符将被视为与其他占位符一样。它们只是与其他值一起存储在字典中。
默认值可以具有特殊值RouteParameter.Optional。如果为占位符分配了此值,则该值不会添加到路径字典中。例如:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{category}/{id}",
defaults: new { category = "all", id = RouteParameter.Optional }
);
对于URI路径“api / products”,路由字典将包含:
- controller: "products"
- category: "all"
但是,对于“api / products / toys / 123”,路线词典将包含:
- controller: "products"
- category: "toys"
- id: "123"
默认值还可以包含不会出现在路径模板中任何位置的值。如果路由匹配,则该值存储在字典中。例如:
routes.MapHttpRoute(
name: "Root",
routeTemplate: "api/root/{id}",
defaults: new { controller = "customers", id = RouteParameter.Optional }
);
如果URI路径为“api / root / 8”,则字典将包含两个值:
- controller: "customers"
- id: "8"
ASP.NET Web API中的路由的更多相关文章
- 【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 中 特性路由(Attribute Routing) 的重名问题
刚才忘了说了,在控制器名重名的情况下,特性路由是不生效的.不然的话就可以利用特性路由解决同名的问题了. 而且这种不生效是真的不生效,不会提示任何错误,重名或者什么的,直接会报告404,所以也是个坑.
- ASP.NET Web API中的Routing(路由)
[译]Routing in ASP.NET Web API 单击此处查看原文 本文阐述了ASP.NET Web API是如何将HTTP requests路由到controllers的. 如果你对ASP ...
- 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 ...
- 目标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 ...
随机推荐
- HDU 1073 Online Judge(字符串)
Online Judge Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- Linux-进程、进程组、作业、会话、控制终端详解
一.进程 传统上,Unix操作系统下运行的应用程序. 服务器以及其他程序都被称为进程,而Linux也继承了来自unix进程的概念.必须要理解下,程序是指的存储在存储设备上(如磁盘)包含了可执行机器指 ...
- JBoss jar包冲突及jar加载顺序
http://blog.163.com/javaee_chen/blog/static/17919507720116149511489/将一个完整的.war包部署到Jboss容器中,启动后报如下错误: ...
- VS创建、安装、调试 windows服务(windows service)
1.创建 windows服务 项目 文件 -> 新建项目 -> 已安装的模板 -> Visual C# -> windows ,在右侧窗口选择"windows 服 ...
- 解决Jenkins无法编译Egret5.0项目的问题
问题的原因可查看:https://blog.csdn.net/sujun10/article/details/75512929 解决 造成这个问题的原因是用户权限分配,你可以通过下面几步解决,而非改e ...
- Scala具体解释---------控制结构和函数
条件表达式: Scala的if else语法结构和Java的一样.只是,Scala的if else表达式有值.这个值就是跟在if或者else后面的表达式的值. 比如: if(x>0) 0 els ...
- Oracle配置客户端
一.引言 当我们需要连接远程的Oracle数据库服务器时,就需要在自己的机器上安装Oracle客户端了. 二.安装步骤与配置 参考:http://blog.csdn.net/luiseradl/art ...
- CCNA2.0笔记_WAN技术-专线
WAN拓扑 Routers.CSU/DSU.WAN switches.Core routers.Modems 使用 数据链路层协议(二层) 来建立对端连接 WAN的三种连接方式 广域网链路类型: ·V ...
- apache commons io入门
原文参考 http://www.javacodegeeks.com/2014/10/apache-commons-io-tutorial.html Apache Commons IO 包绝对是 ...
- 2种实现CXF方法例子
转载自:http://www.blogjava.net/sai5201314vicky/articles/353078.html 大家好,今天我要介绍的现实webservice的一种技术——CXF 由 ...