这篇文章描述 ASP.NET Web API如何将 HTTP 请求通过路由去访问控制器。

如果你熟悉 ASP.NET MVC,Web API 路由是非常类似于 MVC 路由。主要的区别是 Web API 使用的 HTTP 方法,而不是 URI 路径,选择的操作。您还可以使用 MVC 那样的路由在Web API 中。这篇文章不承担任何的 ASP.NET MVC 的知识。

路由表

在 ASP.NET Web API,控制器是一个类,负责处理 HTTP 请求。控制器的公共方法被称为操作方法或简单地行动。当 Web API 框架收到请求时,它将请求路由到行动。

若要确定要调用哪个操作,框架使用的路由表。Web API 的 Visual Studio 项目模板创建一个默认路由 ︰

 routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

这条路线被定义在 WebApiConfig.cs 文件中,放置在 App_Start 目录中 ︰

更多的信息去向WebApiConfig类,请参见配置 ASP.NET Web API.

如果你自承载 Web API,您必须直接在HttpSelfHostConfiguration对象上设置的路由表。更多的信息,请参阅自承载 Web API.

在路由表中的每个条目包含一个路线模板。Web API 的默认路由模板是"api / {控制器} / {id}"。在此模板中,"api"是一种文字路径段和 {控制器} 和 {id} 占位符变量。

当 Web API 框架收到 HTTP 请求时,它尝试匹配的 URI 对路由表中路由模板之一。如果没有路由匹配,客户端收到一个 404 错误。例如,以下 Uri 匹配的默认路由 ︰

  • / api/联系人
  • /api/contacts/1
  • /api/products/gizmo1

然而,以下的 URI 不匹配,因为它缺乏"api"部分 ︰

  • 联系人/1

注 ︰在流程中使用"api"的原因是为了避免碰撞与 ASP.NET MVC 路由。这种方式,你可以有"/ 联系人"转到 MVC 控制器和"/ api/联系人"转到 Web API 控制器。当然,如果你不喜欢本公约,您可以更改默认的路由表。

一旦找到匹配的路由,则 Web API 选择控制器和操作 ︰

  • 若要查找控制器,Web API 中添加"控制器" {控制器}变量的值。
  • 若要查找行动,Web API 看 HTTP 方法,,,然后寻找其名称以该 HTTP 方法名称开始行动。例如,与一个 GET 请求,Web API 查找入手"得到...",如"GetContact"或"GetAllContacts"的行动。本公约只适用于获取、 发布、 放,和删除方法。你可以通过在您的控制器上使用属性启用其他 HTTP 方法。我们会再见的例子。
  • 在路线的模板,例如{id},其他占位符变量映射到操作参数。

让我们看看一个例子。假设你定义以下控制器 ︰

 public class ProductsController : ApiController
{
public void GetAllProducts() { }
public IEnumerable<Product> GetProductById(int id) { }
public HttpResponseMessage DeleteProduct(int id){ }
}

下面是一些可能的 HTTP 请求,以及获取调用每个行动 ︰

请注意, {id}部分的 URI,是否存在,映射到行动的id参数。在此示例中,控制器定义两个 GET 方法,一个带id参数,另一个不带参数。

同时,要注意,POST 请求将失败,因为该控制器未定义"邮政..."方法。

路由的变化

上一节描述了 ASP.NET Web API 的基本路由机制。本节描述了一些变化。

HTTP 方法

而不是使用 HTTP 方法的命名约定,你可以通过装饰与公共、 HttpPut、 HttpPostHttpDelete属性的操作方法显式指定的 HTTP 方法的行动。

在以下示例中,FindProduct 方法被映射到 GET 请求 ︰

 public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {}
}

若要允许多个 HTTP 方法采取行动,或不允许 HTTP 方法得到,放,张贴,和删除,使用AcceptVerbs属性,采用 HTTP 方法的列表。

 public class ProductsController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { } // WebDAV method
[AcceptVerbs("MKCOL")]
public void MakeCollection() { }
}

路由的操作名称

与默认路由选择模板,Web API 使用的 HTTP 方法选择的操作。不过,您还可以创建 URI 中包括的操作名称是哪里一条路线 ︰

 routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

此路线模板中的{行动}参数名称在控制器上的操作方法。与这种风格的路由,使用属性来指定允许的 HTTP 方法。例如,假设您的控制器具有以下方法 ︰

2.1WebApi的路由的更多相关文章

  1. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  2. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  3. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  4. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  5. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  6. ASP.NET路由模型解析

    大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...

  7. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  8. Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现

    前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...

  9. ASP.NET Core的路由[5]:内联路由约束的检验

    当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteC ...

随机推荐

  1. CH Round #72树洞[二分答案 DFS&&BFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

  2. MAVEN构建Spring +Spring mvc + Mybatis 项目(Maven配置部分(workshop))

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  3. ubuntu的使用

    1.使用ssh windows下通过winscp,putty(ssh) 等连接ubuntu 需安装ssh服务 ubuntu桌面版本 默认并没有安装ssh服务,如果通过ssh链接ubuntu,需要自己手 ...

  4. Codeforces Canda Cup 2016

    A.B:模拟 C.构造下就行了 D.题意:n个参加ACM的队(n<=300000),每个队都有自己的初始气球数和重量,规定如果气球数>重量,那么此队就会飞起来,淘汰出局,你现在是第一组,你 ...

  5. Linux 下配置php开发环境

    windows下有一键安装的环境很方便,不过现实中常常服务器是linux系统.想要搭建环境怎么搞呢? 边学变发直播博客,不定期更新.

  6. Angularjs+node+Mysql实现地图上特定点的定位以及附加信息展示

    注:本博文为博主原创,转载请注明出处. 在上一篇博文中主要讲述了如何利用AngularJs+Node+MySql构建项目,并实现地图上的多点标注,今天在这篇文章中,我们将在上一个项目的基础上,实现特定 ...

  7. cosbench read异常解决办法。 Unable to verify integrity of data download. Client calculated content hash didn't match hash calculated by Amazon S3. The data may be corrupt.

    问题:cosbench read测试failed 报错如下 Cosbench v0.4.2.c4 against Ceph (Hammer) / radosgw / HAproxy's HTTP en ...

  8. jQuery瀑布流简单示例

    1,以下demo是基于window的滚动  

  9. 红米3 SudaMod(android_6.01_r72)高配指纹/农历/归属地/SM天气/流畅运行/红外线正常/更新于20161025

    一.写在前面 我只是个人爱好,本ROM未集成任何第三方推广软件,我只是喜欢把好的资源分享出来,若可以,我们一起学习,一起进步. 请不要问我怎么刷机! 请不要问我玩游戏卡不卡(有钱你就换好点的手机)! ...

  10. Zabbix监控mysql主从复制状态

    原理 mysql slave show slave status\G 在输出信息中查看I/O线程和SQL线程的状态值(YES为正常,NO为错误) Slave_IO_Running: Yes Slave ...