Asp.Net Web API 2第五课——Web API路由

Asp.Net Web API 导航

    Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html

Asp.Net Web API第二课——CRUD操作 http://www.cnblogs.com/aehyok/p/3434578.html

Asp.Net Web API第三课——.NET客户端调用Web API http://www.cnblogs.com/aehyok/p/3439698.html

Asp.Net Web API第四课——HTTPClient消息处理器 http://www.cnblogs.com/aehyok/p/3441915.html

前言

本文描述了 ASP.NET Web API 如何将 HTTP 请求路由到控制器。

如果你熟悉Asp.Net MVC,Web API的路由与Asp.Net MVC的路由是非常类似的。这主要的区别就是Web API使用的是HTTP方法,而不是URI路径来选择Action。你也可以在Web API中使用MVC风格的路由。本文不需要有任何Asp.Net MVC的基础。

Routing Tables路由表

  在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public 方法被叫做action方法或者简单的Aciton。当Web API接收到一个请求的时候,它将这个请求路由到一个Action。

  为了确定那个Action被调用,这个框架使用了一个路由表。Visual Studio中Web API的项目模板会创建一个默认路由:

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

这个路由是在WebApiConfig.cs文件中定义的,该文件位于App_Start目录。

关于WebApiConfig类的更多信息参阅“配置ASP.NET Web API”(暂未实现)

如果你要自己托管(self-host )Web API,你必须直接在HttpSelfHostConfiguration对象上设置路由表。更多信息参阅“自托管Web API"。(暂未实现)

  路由表中的每一个条目都包含一个路由模板。这个Web API默认的路由模版是"api/{controller}/{id}"。在这个模版中,“api”是一个文字式路径片段,而{controller}和{id}则是占位符变量。

  当Web API框架接收一个HTTP请求时,它会试图根据路由表中的一个路由模板来匹配其URI。如果无路由匹配,客户端会接收到一个404(未找到)错误。例如,以下URI与这个默认路由的匹配:

  • /api/contacts
  • /api/contacts/1
  • /api/products/gizmo1

然而,以下URI不匹配,因为它缺少“api”片段:

  • /contacts/1

在路由中使用“api”的原因是为了避免与ASP.NET MVC的路由冲突。通过这种方式,可以用“/contacts”进入一个MVC控制器,而“/api/contacts”进入一个Web API控制器。当然,如果你不喜欢这种约定,你也可以修改这个默认路由表。

一旦一个匹配的路由被发现,Web API便会选择相应的Controller和Action。

  1.为了找到Controller,Web API会把“控制器”加到{controller}变量的值。

  2.为了找到Action,Web API会查找HTTP方法,然后寻找一个名称以HTTP方法名开头的方法。例如,对于一个Get请求,Web API会查找一个以“Get…”开头的动作,如“GetContact”或“GetAllContacts”等。这种约定只应用于GET、POST、PUT和DELETE方法。通过在你的Controller上使用attributes,你可以启用其他的HTTP方法。稍后我们就会看到一个例子。

  3.路由模版中其他的占位变量,例如{id},将被映射成Action的参数。

让我们来看一个简单的例子,假设你定义了以下控制器:

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

以下是一些可能的HTTP请求,以及要被调用的每个动作:

注意,URI中的{id}片段如果出现,会被映射成Action的id参数。在这个例子中,这个控制器定义了两个GET方法,一个带有id参数的和一个不带有id参数的。

另外要注意,POST请求是失败的,因为该控制器未定义“Post…”方法。

Routing Variations路由变化

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

HTTP方法

替代使用HTTP方法的命名约定,你可以明确的为一个Action指定HTTP方法,通过以HttpGet、HttpPost、HttpPut或者HttpDelete属性来对Action方法进行修饰。

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

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

允许一个Action对应多个HTTP方法,或者允许除了Get、Put、Post、Delete方法之外的HTTP方法,需要使用AcceptVerbs注解属性,它以HTTP方法列表作为参数。

public class ProductsController : ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Product FindProduct(id) { }

    // WebDAV method
    [AcceptVerbs("MKCOL")]
    public void MakeCollection() { }
}

第一个方法:指示该动作接收HTTP的GET和HEAD方法(这个HEAD没测试过)

第二个方法:WebDAV方法(基于Web的分布式著作与版本控制的HTTP方法,是一个扩展的HTTP方法

MKCOL是隶属于WebDAV的一个方法,它在URI指定的位置创建集合(WebDAV更没见过)

通过Action名称路由

在默认的路由模版中,这个Web API使用HTTP方法去选择Action。然而,你也可以在URI中创建包含动作名的路由:

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

在这个路由模板中,{action}参数命名了控制器上的动作方法。采用这种风格的路由,需要使用注解属性来指明所允许的HTTP方法。例如,假设你的控制器已有如下方法:

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

在这种情况下,一个Get请求"api/Products/Details/1"将会映射到这个这个Details方法。这种风格的路由类似于Asp.Net MVC,而且可能与RPC式的API相接近。(RPC风格不太懂,还没查资料)

你也可以通过使用ActionName注解属性来覆盖动作名。在以下例子中,有两个动作映射到“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

为了防止一个方法被作为一个动作所请求,可以使用NonAction注解属性。它对框架发出信号:这个方法不是一个动作,,即使它可能与路由规则匹配。

总结

本节课主要是提供了关于路由的整体概述。下一课的内容将会精确的描述框架如何把URL匹配到路由、如何选择控制器、以及选择动作进行调用。

本文参考链接:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

时间: 03-27

Asp.Net Web API 2第五课——Web API路由的相关文章

Asp.Net Web API 2第六课——Web API路由和动作选择

Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web API第二课——CRUD操作http://www.cnblogs.com/aehyok/p/3434578.html Asp.Net Web API第三课——.NET客户端调用Web API http://www.cnblogs.com/aehyok/p/3439698.html Asp.Net Web

《ASP.NET SignalR系列》第五课 在MVC中使用SignalR

接着上一篇:<ASP.NET SignalR系列>第四课 SignalR自托管(不用IIS) 一.概述 本教程主要阐释了如何在MVC下使用ASP.NET SignalR. 添加SignalR库到MVC中. 创建hub和OWIN startup 类来推送内容到客户端. 在页面中使用SignalR jQuery 库发送消息和呈现从来得更新. 下面屏幕截图展示了一个完成的聊天应用程序 二.创建项目 1.用MVC5 .NET4.5 创建一个名为SignalRChat的项目 2.改变授权. 3.选择 N

Asp.Net Web API 2第八课——Web API 2中的属性路由

参考页面: http://www.yuanjiaocheng.net/webapi/web-api-gaisu.html http://www.yuanjiaocheng.net/webapi/create-web-api-proj.html http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-api-controller.html http://www.yuan

Asp.Net Web API 2第七课——Web API异常处理

前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Net Web API中错误和异常的处理,包括以下几点: 1.HttpResponseException——HTTP响应异常 2.Exception Filters——异常过滤器 3.Registering Exception Filters——注册异常过滤器 4.HttpError——HTTP错误 H

Web前端学习-第五课JavaScript篇

Q9:什么是跨域?什么是JSON?什么是JSONP?解决跨域问题有哪些方法?请结合代码和文字说明. 跨域:因为JavaScript同源策略(一段脚本只能读取来自同一来源的窗口和文档的属性,同一来源指主机名,协议和端口号的组合)的限制,a.com域名下的js无法操作b.com域名下的对象,只要是协议,域名,端口有任何一个不同都被当做是不同的域: Json(JavaScript Object Notation):一种轻量级的数据交换格式.基于ECMAScript的一个子集.采用完全独立于语言的文本格

Web前端学习-第五课HTML篇

Q12:HTML5有哪些新颖? 1.用于绘画的canvas元素: 2.用于媒介回放的video和audio元素: 3.对本地离线存储的更好的支持: 4.新的特殊内容元素,比如article,footer,header,nav,section: 5.新的表单控件,比如calender,date,time,Email,URL,search: 6.新特性基于HTML,css,DOM,以及JavaScript: 7.减少对外部插件的需求: 8.更优秀的错误处理: 9.更多取代脚本的标记: 10.HTML

VB API 之 第五课 字体之其他函数介绍

GetFontLanguageInfo() GetFontLanguageInfo()函数返回指定设备中字体的信息. 它的声明形式如下所示: Private Declare Function GetFontLanguageInfo Lib "gdi32" Alias "GetFontLanguageInfo" (ByVal hdc As Long) As Long GetFontLanguageInfo()函数返回Long型值,如果返回值为0,表示是简单字体:返回G

Asp.Net Web API 2第十课——使用OWIN自承载Web API

前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本教程主要来展示在控制台应用程序中如何通过OWIN来承载Web API. Open Web Interface for .NET (OWIN)在Web服务器和Web应用程序之间建立一个抽象层.OWIN将网页应用程序从网页服务器分离出来,然后将应用程序托管于OWIN的程序而离开IIS之外. 本文仍将使用VS2013. 本文的示

ASP.NET MVC Web API 学习笔记---第一个Web API程序

http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有