[译]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(路由)的更多相关文章

  1. 【ASP.NET Web API教程】4.1 ASP.NET Web API中的路由

    原文:[ASP.NET Web API教程]4.1 ASP.NET Web API中的路由 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. ...

  2. ASP.NET WEB API 中的路由调试与执行过程跟踪

    路由调试 RouteDebugger 是调试 ASP.NET MVC 路由的一个好的工具,在ASP.NET WEB API中相应的有 WebApiRouteDebugger ,Nuget安装 Inst ...

  3. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  4. 在ASP.NET Web API中使用OData

    http://www.alixixi.com/program/a/2015063094986.shtml 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在A ...

  5. ASP.NET Web API中使用OData

    在ASP.NET Web API中使用OData 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在ASP.NET Web API中,对于CRUD(creat ...

  6. ASP.NET Web API框架揭秘:路由系统的几个核心类型

    ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...

  7. 目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择

    目标HttpController在ASP.NET Web API中是如何被激活的:目标HttpController的选择 ASP.NET Web API能够根据请求激活目标HttpController ...

  8. ASP.NET Web API中实现版本的几种方式

    在ASP.NET Web API中,当我们的API发生改变,就涉及到版本问题了.如何实现API的版本呢? 1.通过路由设置版本 最简单的一种方式是通过路由设置,不同的路由,不同的版本,不同的contr ...

  9. 在ASP.NET Web API中实现CORS(跨域资源共享)

    默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...

随机推荐

  1. 关于Java String对象创建的几点疑问

    我们通过JDK源码会知道String实质是字符数组,而且是不可被继承(final)和具有不可变性(immutable).可以如果想要了解String的创建我们需要先了解下JVM的内存结构. 1.JVM ...

  2. Just a complaint about the college examinations

    Well , you know. As a college student who want to find a good job after graduating  like me , scores ...

  3. 我的Android 4 学习系列之Intent 和 Broadcast Reciever

    目录 Intent 简介 使用隐式和显式Intent启动Activity.子Acitivity和Service 使用Linkify 使用Broadcast Intent 广播事件 使用 Pending ...

  4. div高度自适外层div高度随里层div高度自适

    尝试过许多办法 其中一网友的最靠谱就是在外层div样式添加两个标签(不能少) clear:both;  overflow:auto;

  5. [Java]利用拦截器和自定义注解做登录以及权限验证

    1.自定义注解 需要验证登录的注解 package com.etaofinance.wap.common; import java.lang.annotation.Documented; import ...

  6. Android最新支持包Design简介

    Android 5.0 Lollipop是曾经最著名的Android发布之一,这样说很大一部分原因是材料设计的引入,而材料设计则是一种刷新了整个Android体验的设计语言.这个详细说明是开始适应材料 ...

  7. 如何使ActionBar不那么单调

    此时我没有生产博客,此时我只是优秀博客的搬运工! 博客原址,有兴趣的可以查看一下. 详情如下: 使ActionBar不那么单调 回到2013年5月份,每一个人都发觉了Play Music中Action ...

  8. Node填坑教程——常用库

    作为函数式编程来说,流程控制和函数库是必不可少的(应该吧). 下面我们介绍两个常用的库. lodash:完整的api请参阅,https://lodash.com/docs.这里我们只演示几个简单的例子 ...

  9. NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

    NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.N ...

  10. 随便讲讲XSS攻击

    作为一个前端工程师,XSS漏洞不应该只是安全部门的工作.在项目上马的时候就应该对可能涉及的安全问题有所预防才是有一个好前端.- -   什么是XSS •跨站脚本攻击(Cross-site script ...