[翻译]ASP.NET Web API的路由
在我们新建一个Web API项目时,会在App_Start文件夹下的WebApiConfig.cs中定义一个默认路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在默认路由中加入“api”是为了避免与ASP.NET MVC的路由冲突。当然如果你不喜欢这个约定,可以修改默认路由。
路由匹配规则:{controller}和{id}略过,只介绍action的匹配。
1.Web API首先根据HTTP方法名寻找命名以HTTP方法名开头的action。举例:
public class ProductsController : ApiController
{
public void GetAllProducts() { }
public IEnumerable<Product> GetProductById(int id) { }
public HttpResponseMessage DeleteProduct(int id){ }
}
aaarticlea/png;base64,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" alt="" />
2.但是上面的约定只适用于GET、POST、PUT和DELETE方法。其他的HTTP方法可以使用AcceptVerbs attribute匹配,前面的四种方法亦同样适用。举例:
public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {}
}
public class ProductsController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { } // WebDAV method
[AcceptVerbs("MKCOL")]
public void MakeCollection() { }
}
3.根据action名匹配(重写路由)。举例:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
3.1.根据上面的路由规则“api/products/details/1”的GET请求将会匹配:
public class ProductsController : ApiController
{
[HttpGet]
public string Details(int id);
}
3.2.可以使用ActionName attribute重写action名。举例:
public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]
public HttpResponseMessage GetThumbnailImage(int id); [HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id);
}
这样"api/products/thumbnail/id”就有两个匹配,分别对应GET和POST。
4.如果一个方法不想被当作action调用,可以使用NonAction attribute,举例:
// Not an action method.
[NonAction]
public string GetPrivateData() { ... }
[翻译]ASP.NET Web API的路由的更多相关文章
- ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?
ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...
- [翻译]ASP.NET Web API 2 中的全局错误处理
目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...
- 2.3属性在 ASP.NET Web API 2 路由
路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...
- ASP.NET Web API编程——路由
路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...
- [翻译]ASP.NET Web API 2入门
原文:Getting Started with ASP.NET Web API 2 Step 1:新建一个Empty的Web API Project. Step 2:添加一个Model: public ...
- 2.4使用属性在 ASP.NET Web API 2 路由创建一个 REST API
Web API 2 支持一种新型的路由,称为属性路由.属性路由的一般概述,请参阅属性路由 Web API 2 中.在本教程中,您将使用属性路由创建一个 REST API 集合的书.API 将支持以下操 ...
- ASP.NET WEB API 特性路由
一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...
- ASP.NET Web API 路由对象介绍
ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
随机推荐
- jenkins持续集成配置备忘
配过好几次,但是老忘记.记录备忘. 安装下列插件: ssh和git插件用来下载源码 publish over ssh 插件用来发布代码到测试环境. email插件用来更强大的email配置. file ...
- [MySQL]快速解决"is marked as crashed and should be repaired"故障
具体报错如下: Table '.\Tablename\posts' is marked as crashed and should be repaired 提示说论坛的帖子表posts被标记有问题,需 ...
- innobackupex自动备份脚本(增量备份,自动压缩)
#!/bin/bash #日期转为天数 function date2days { echo "$*" | awk '{ z=-$)/); y=$+-z; m=$+*z-; j=*m ...
- 树莓派(Rospberry Pi B+)到货亲測
1 图鉴 Rospberry Pi B+最终在今天下午有蜗牛快递公司圆*送到了.B+主要是添加了2个USB,添加了GPIO,sd卡换成了micro sd ...先不说直接上图再说,期待了好久好久 w ...
- [React Native] Passing data when changing routes
The way you make HTTP requests in React Native is with the Fetch API. In this video we'll talk about ...
- QT显示输出及其桌面
/* 应用程序桌面 */ QDesktopWidget* desktop = QApplication::desktop(); /* 指定显示器的屏幕尺寸(1024 * 768) */ QRect ...
- Linux--------------更改yum
1.进入yum配置文件目录 cd /etc/yum.repos.d 2.备份配置文件 mv CentOS-Base.repo CentOS-Base.repo.bak ...
- 【转载】soapui基于持续集成工具自动化运行的调研姿势
soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...
- 开源安全测试 - BackTrack的应用
开源安全测试 - BackTrack的应用: http://gdtesting.com/product.php?id=99
- [置顶] 第一天初试linux
1).unix linix macos android 的区别 Unix是要收费的,而linix是一种开源免费的unix ,macos 和andorid又是linux的一种,macos闭源,仅仅是 ...