ASP.NET Web API的路由和ASP.NET MVC相似,也是把路由放在RouteTable中的。可以在App_Start文件夹中的WebApiConfig.cs中设置路由模版。默认的路由模版是:

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

● 静态片段api,主要用来区分ASP.NET MVC的路由。
● 为什么没有{action}?默认情况下,可以根据惯例找到Action,只要Action的名称符合惯例。
● 占位符变量{id}映射Action的参数。

□ 根据惯例路由

对于GET,POST,PUT,DELETE请求,如果Action的名称以Get, Post, Put, Delete开头,这就是符合惯例,意味着在请求的url中无需指明Action,就可以路由到对应的Action中。

假设有这样的一个api控制器:

public class BooksController : ApiController
{
    public void GetAllBooks(){}
    public IEnumerable<Book> GetBookById(int id)
    public HttpResponseMessage DeleteProduct(int id){}
}

● 浏览器输入:api/books 并且是Get请求

不带参数,由于GetAllBooks的名称以Get开头,符合惯例,这里会映射到GetAllBooks方法。

● 浏览器输入:api/books/8 并且是Get请求

带参数,会映射到GetBookById(int id)方法上。Web API会把字符串类型的8赋值给int类型的参数变量id。

● 浏览器输入:api/books/8 并且是DELETE请求
映射到DeleteProduct(int id)

● 浏览器输入:api/books 并且是POST请求
没有对应POST请求的Action。返回404状态码。

□ 根据HTTP方法路由

HttpGet, HttpPut, HttpPost, HttpDelete属性可以打在Action上面。

public class BooksController : ApiController
{
    [HttpGet]
    public Book FindBook(id){}
}

如果一个Action允许有多个HTTP方法,就使用AcceptVerbs属性。

public class BooksController ; ApiController
{
    [AcceptVerbs("GET","HEAD")]
    public Book FindProduct(id){}
}

□ 考虑Action的路由

我们可以在WebApiConfig.cs中设置路由的模版,把Action考虑进去。

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

在api控制器中:

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

此时,在浏览器中输入类似"api/books/details/8"的格式,才能映射到Details(int id)方法上。

还可以通过ActionName属性给Action取别名:

public class BooksController : ApiController
{
    [ActionName("Sth")]
    public HttpResposneMessage GetSth(int id);
}

如果不想让Action参与到路由中,可以使用NoAction属性。

public class BooksController : ApiController
{
    [NonAction]
    public string GetSomeData(){}
}

总结:在WebApiConfig.cs中定义的路由模版都被放到了RouteTable中了。在Action层面,如果想让请求路由到Action上,可以通过惯例、Http方法属性来实现。

ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置的更多相关文章

  1. ASP.NET Web API实践系列04,通过Route等特性设置路由

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  2. ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Knockout实现页面元素和视图模型的双向绑定

    本篇接着上一篇"ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API",尝试获取数据. 在Models文件夹下创 ...

  3. ASP.NET Web API实践系列05,消息处理管道

    ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的 ...

  4. ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求

    ASP.NET Web API本质是由一个进程托管的一组类,需要宿主,这个宿主可以是ASP.NET应用程序,可以是MVC项目,可以是控制台应用程序,也可以是自己定制的宿主. 在VS2012中创建一个& ...

  5. ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿

    创建一个空的ASP.NET Web Form项目. 右键项目,添加新项,创建Web API控制器类,TestController. 删除掉TestController默认的内容,编写如下: using ...

  6. ASP.NET Web API 2系列(二):灵活多样的路由配置

    1. 导言 路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Action的名称, ...

  7. ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API

    本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API. 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"基本&q ...

  8. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

    本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...

  9. ASP.NET Web API实践系列11,如何设计出优秀的API

    本篇摘自:InfoQ的微信公众号 在设计API的时候考虑的问题包括:API所使用的传输协议.支持的消息格式.接口的控制.名称.关联.次序,等等.我们很难始终作出正确的决策,很可能是在多次犯错之后,并从 ...

随机推荐

  1. Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

    转自http://blog.csdn.net/droidphone/article/details/7165482 1.  ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...

  2. centos7和centos6的区别【转】

    最近发的文章,有人咨询我,说为啥不用centos7,而用centos6,这个跟个人习惯和生产环境元素决定的.centos7和6变化的就很大的.我收集了一些区别,给大家看看. 注意:生产环境推荐cent ...

  3. 【前端vue开发】vue开发总结

  4. Faster R-CNN在GPU下的安装、测试经历

    在公司的服务器上安装faster rcnn时,遇到了不少问题: 1.cudnn版本不兼容的问题,解决办法参考: http://blog.csdn.net/WoPawn/article/details/ ...

  5. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  6. List集合去除重复对象及equals()、hashCode()方法的作用

    原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...

  7. js单元测试框架

    js单元测试框架 前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试 ...

  8. 【LOJ】#2509. 「AHOI / HNOI2018」排列

    题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ...

  9. 使用Sublime Text 3的HTML-CSS-JS Prettify插件格式化代码

    很多时候,我们想要格式化HTML-CSS-JS代码,网站上有很多实现此功能的小工具,当然,我的网站首页也有.但是,如果我们的代码编辑器上面也有这样的功能,那不是更加快速便捷?So,接下来,我们看看Su ...

  10. CI框架与Thinkphp框架的一些区别

    初学CI框架遇到的一些问题,与Thinkphp框架对比的不同之处. system             是框架核心 application        是项目目录 index.php        ...