这一篇文章描述了ASP.NET API如何将HTTP请求路由到控制器。

如果你熟悉ASP.NET MVC,Web API路由和MVC路由非常相似,主要的不同地方是Web API使用HTTP方法,而不是URI路径去选择action。你也能够在WebAPI中使用MVC风格的路由,这一篇文章不讨论任何有关MVC的知识。

路由表:

在ASP.NET Web API 中,一个控制器是一个处理HTTP请求的类,Controller中的公共方法称作action方法或者简单方法,当Web API框架接收到一个请求,框架将请求路由到一个action。

Web API框架使用路由表(route table)来决定哪一个action被调用。VS的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 .

如果使用自寄宿(self-host)的Web API,必须通过HttpSelfHostConfiguration自己设置路由表,更多信息可以参考:Self-Host a Web API.

路由表中的每个条目包含一个模板,默认的Web API路由模版是“api/{controller}/{id}”。这个模版里,“api”是一个纯文本路径段,{controller}和{id}是占位符(参数变量)。当Web API框架接收到一个请求时,尝试将URI与路由表中的项(路由模版)匹配,如果没有可以匹配的路由项,则返回一个404错误,比如下面三个uri可以和默认的路由模版进行匹配。

/api/contacts

/api/contacts/1

/api/products/gizmo1

但是/contacts/1这个就匹配不了因为缺少“api"段。

:Web API 路由模版使用“api”开头是为了避免与MVC的路由模版冲突,这样你能够使用"/contacts"URI去路由到一个MVC controller,而使用"api/contacts" 路由到一个Web API controller。当然,如果你不喜欢,可以修改默认的路由模版。


一旦找到匹配的路由,Web API则进行controller和action的选择

--To find the controller, Web API adds "Controller" to the value of the {controller} variable.

--匹配action,Web API 查看本次HTTP 方法,比如:如果是GET方法,则在controller中查找Get开头的方法,这种查询以HTTP请求方式开头的action的方式只适合GET , POST , PUT 和 DELETE 方式Http请求???,你可以通过为action添加标识属性的方法来指定action可匹配的HTTP请求方式以及允许其他的HTTP请求方式。

--其他的路由模版中的占位符变量,比如{id},映射为一个action参数。

下面看一个例子:定义一个如下的controller

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

下面表格展示了不同的URI所调用的action

HTTP Method

URI Path

Action

参数

GET

api/products

GetAllProducts

GET

api/products/4

GetProductById

4

DELETE

api/products/4

DeleteProduct

4

POST

api/products

没有匹配的action

注意:这里的{id}段,如果指定了{id}的值,则调用有id参数的action方法 GetProductById。

因为没有定义Post开头的aciton方法,所以POST方式的请求找不到匹配的action。


路由拓展

--使用Http Methods 标识属性:除了定义以HTTP请求方式开头的action方法外,我们可以使用HttpGet  , HttpPut  ,  HttpPost  或者 HttpDelete标识属性来指定一个action方法匹配的HTTP请求方式(与使用HTTP请求方式开头的方法名效果一样),例如,下面这个方法可以和GET请求方式的HTTP请求匹配。

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

如果一个action方法需要匹配多种HTTP请求方式,或者需要匹配除GET,POST,PUT,DELETE请求方式外的其他请求,可以使用AccptVerbs标识属性。例如:FindProduct方法可以同时匹配 GET 和 HEAD请求。

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

--使用MVC风格的路由

定义路由模版:

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

在这个路由模版中,{action}参数指定controller中的action的名称,使用这种风格的路由,需要使用标识属性指定action允许匹配的HTTP请求方式,比如:必须使用[HttpGet]、[HttpPost]等标识属性。

public class ProductsController : ApiController
{[HttpGet]public string Details(int id);
}

上面的例子中一个“api/products/details/1”的GET请求,将映射到Details方法。这种风格很像MVC,可能更适合用在一个RPC-style API中。

--使用ActionName属性定义action的别名:

public class ProductsController : ApiController
{[HttpGet][ActionName("Thumbnail")]public HttpResponseMessage GetThumbnailImage(int id);[HttpPost][ActionName("Thumbnail")]public void AddThumbnailImage(int id);
}

我们可以发送uri为 "api/products/thumbnail/id"的GET请求 map to GetThumbnailImage方法。

发送uri为"api/products/thumbnail/id"的POST请求 map to AddThumbnailImage 方法。

通过上面几个例子可以看出,可以使用标识属性,配置一个action方法用作匹配路由的名称和方法。

--使用[NonAction]标识属性来指定一个方法不为action方法

转载于:https://www.cnblogs.com/zkun/p/4169650.html

Web API-路由(一)相关推荐

  1. ASP.NET Web API 路由对象介绍

    前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了一些微小的修改,这也是根据每个框架的特性来制定 ...

  2. Web API路由和动作选择

    前言 本文描述ASP.NET Web API如何把一个HTTP请求路由到控制器的一个特定的Action上.关于路由的总体概述可以参见上一篇教程 http://www.cnblogs.com/aehyo ...

  3. Asp.net Web Api 路由 和 异常处理

    一.路由: 新建一个ASP.NET MVC4 Web Application项目之后,我们会发现在网站根目录下有个App_Start文件夹.找到下面的RouteConfig.cs文件,如下: publ ...

  4. ASP.NET Web API路由规则(二)

    默认的规则 在ASP.NET MVC4中 global.asax.cs代码中并无注册默认路由规则的代码 代码如下: public class WebApiApplication : System.We ...

  5. webapi 路由限制命名控件_解决Web API路由配置支持Area及命名空间参数

    usingSystem;usingSystem.Collections.Concurrent;usingSystem.Collections.Generic;usingSystem.Linq;usin ...

  6. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  7. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  8. .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...

    25 | 路由与终结点:如何规划好你的Web API 路由系统在 ASP.NET MVC 框架里面就已经存在了,在 ASP.NET Core 框架里面进行了改进 路由系统的核心作用是指 URL 和 应 ...

  9. 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  10. ASP.NET Core Web APi获取原始请求内容

    前言 我们讲过ASP.NET Core Web APi路由绑定,本节我们来讲讲如何获取客户端请求过来的内容. ASP.NET Core Web APi捕获Request.Body内容 [HttpPos ...

最新文章

  1. AtomicBoolean 的使用与介绍
  2. matplotlib 入门之Image tutorial
  3. 学习笔记:UINavigationbar的背景修改方法集合
  4. easyui的tree获取父节点_力扣 1519——子数中标签相同的节点数
  5. 把学单片机过程中遇到的问题与大家分享
  6. 深度 | 带领国产数据库走向世界,POLARDB底层逻辑是什么?
  7. Django实战1-权限管理功能实现-10:用户管理
  8. 程序员面试金典——1.6像素翻转
  9. Java学习手册:数据结构与算法汇总
  10. isis软件添加源代码c语言,ProteusISIS和Keil软件入门学习..doc
  11. Android mvparms 踩坑
  12. LaTeX数学符号大全(转载)
  13. 【超分辨率】【深度学习】SRCNN pytorch代码(附详细注释和数据集)
  14. 机械制图标准化基础知识简介
  15. 关闭WPS右键菜单,以及热点,广告弹窗推送
  16. C# 使用 windowsmedia循环播放视频
  17. Gateway断言功能详解
  18. BeanPostProcessor妙用(转载)
  19. 如何使用COM-Hunter检测持久化COM劫持漏洞
  20. 2017年11月14日 星期二

热门文章

  1. 说说 Spring 事务管理的实现类
  2. 编程开发之--java多线程学习总结(5)
  3. 十 Appium环境搭建(Windows版)
  4. UVa11427 Expect the Expected
  5. script的加载方式与执行
  6. spring 初始化数据库
  7. 不完全恢复分类与命令
  8. Windows 7使用wubi硬盘安装Ubuntu (文字版)
  9. 活久见: 原来 Chrome 浏览器支持 Import from 语法
  10. 使用salt-api来搭建salt自动化平台