当前位置 > 首页 > Asp.net

【ASP.NET Web API教程】4.2 路由与动作选择

2012-12-4 12:50:00来源:Asp.net

注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本系列教程,请先看前面的内容。

4.2 Routing and Action Selection
4.2 路由与动作选择

本文引自:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

By Mike Wasson | July 27, 2012
作者:Mike Wasson | 日期:2012-7-27

This article describes how ASP.NET Web API routes an HTTP request to a particular action on a controller.
本文描述ASP.NET Web API如何把一个HTTP请求路由到控制器的一个特定的方法上。

For a high-level overview of routing, see Routing in ASP.NET Web API.
关于路由的总体概述,参阅“ASP.NET Web API中的路由”(本系列教程的前一小节 — 译者注)。

This article looks at the details of the routing process. If you create a Web API project and find that some requests don’t get routed the way you expect, hopefully this article will help.
本文考察路由过程的细节。如果你创建了一个Web API项目,并发现有些请求并未按你期望的方式被路由,希望这篇文章对你会有所帮助。

Routing has three main phases:
路由有三个主要阶段:

  1. Matching the URI to a route template.
    将URI匹配到一个路由模板。
  2. Selecting a controller.
    选择一个控制器
  3. Selecting an action.
    选择一个动作。

You can replace some parts of the process with your own custom behaviors. In this article, I describe the default behavior. At the end, I note the places where you can customize the behavior.
你可以用自己的自定义行为来替换这一过程的某些部分。在本文中,我会描述默认行为。最后,我会注明可以在什么地方自定义行为。

Route Templates
路由模板

A route template looks similar to a URI path, but it can have placeholder values, indicated with curly braces:
路由模板看上去类似于一个URI路径,但它可以具有占位符,这是用花括号来指示的:

"api/{controller}/public/{category}/{id}"

When you create a route, you can provide default values for some or all of the placeholders:
当创建一条路由时,可以为某些或所有占位符提供默认值:

defaults: new { category = "all" }

You can also provide constraints, which restrict how a URI segment can match a placeholder:
也可以提供约束,它限制URI片段如何与占位符匹配:

constraints: new { id = @"\d+" } // Only matches if "id" is one or more digits.
// 用正则表达式限制片段的取值,上语句表明,id片段的值必须是一个或多个数字。
// 因此,URI中id片段必须是数字才能与这条路由匹配

The framework tries to match the segments in the URI path to the template. Literals in the template must match exactly. A placeholder matches any value, unless you specify constraints. The framework does not match other parts of the URI, such as the host name or the query parameters. The framework selects the first route in the route table that matches the URI.
框架会试图把URI路径的片段与该模板进行匹配。模板中的文字必须严格匹配。占位符可以匹配任意值,除非你指定了约束。框架不会匹配URI的其它部分,如主机名或查询字符串。框架会选择路由表中与URI匹配的第一条路由。

There are two special placeholders: "{controller}" and "{action}".
有两个特殊的占位符:“{controller}”和“{action}”。

  • "{controller}" provides the name of the controller.
    “{controller}”提供控制器名。
  • "{action}" provides the name of the action. In Web API, the usual convention is to omit "{action}".
    “{action}”提供动作名。在Web API中,通常的约定是忽略“{action}”的。

Defaults
默认值

If you provide defaults, the route will match a URI that is missing those segments. For example:
如果提供默认值,该路由将能够匹配缺少这些片段的URI。例如:

routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{category}",
defaults: new { category = "all" }
);

The URI "http://localhost/api/products" matches this route. The "{category}" segment is assigned the default value "all".
URI“http://localhost/api/products”与这条路由是匹配的。“{category}”片段被赋成了默认值“all”。

Route Dictionary
路由字典

If the framework finds a match for a URI, it creates a dictionary that contains the value for each placeholder. The keys are the placeholder names, not including the curly braces. The values are taken from the URI path or from the defaults. The dictionary is stored in the IHttpRouteData object.
如果框架为一个URI找到一个匹配,它会创建一个字典,其中包含了每个占位符的值。(字典的内容是一些“键-值”对 — 译者注)。其键是不带花括号的占位符名称。其值取自URI路径或默认值。该字典被存储在IHttpRouteData对象中。

During this route-matching phase, the special "{controller}" and "{action}" placeholders are treated just like the other placeholders. They are simply stored in the dictionary with the other values.
在路由匹配阶段,“{controller}”和“{action}”占位符的处理与其它占位符的处理是一样的。只是把它们简单地用值存储在字典中。

A default can have the special value RouteParameter.Optional. If a placeholder gets assigned this value, the value is not added to the route dictionary. For example:
在默认值中可以使用特殊的RouteParameter.Optional值。如果一个占位符被赋予了这个值,则该值不会被添加到路由字典。例如:

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

For the URI path "api/products", the route dictionary will contain:
对于URI路径“api/products”,路由字典将含有:

  • controller: "products"
  • category: "all"

由于这条URI路径中不包含id,因此,id的值将采用默认的RouteParameter.Optional,所以,路由字典中不会包含id片段的键值对 — 译者注

For "api/products/toys/123", however, the route dictionary will contain:
然而,对于“api/products/toys/123”,路由字典将含有:

  • controller: "products"
  • category: "toys"
  • id: "123"

The defaults can also include a value that does not appear anywhere in the route template. If the route matches, that value is stored in the dictionary. For example:
默认值也可以包含未出现在路由模板中的值。若这条路由匹配,则该值会被存储在路由字典中。例如:


  • WCF学习心得之异步调用(基础)

    2010-4-20 7:38:00

    阅读: 107 评论: 0 作者: GaryChen 发表于 2010-04-19 23:54 原文链接 上周五我们的WPF客户端在用户环境下测试的时候,由于网络环境太差造成的界面卡死,

  • LINQ in Action in Spanish

    2009-4-17 8:23:00

    Today I had the pleasure to receive a copy of LINQ in Action translated in Spanish. This came a b

  • Asp.net的Ajax TabContainer控件是通过鼠标点击标签切换选项卡, 如何改为鼠标经过标签切换选项卡?

    2011-1-29 14:03:00

    Asp.net的Ajax TabContainer控件是通过鼠标点击标签切换选项卡, 如何改为鼠标经过标签切换选项卡? 谢谢.....

  • [翻译]你或许还为听说过的一些ASP.NET 2.0要诀

    2007-4-22 0:08:00

    摘要: 看了Dflying Chen的本周英文资料推荐,其中的 一篇文章 尤其吸引人,本来只是直接收藏起来,但想想还是翻译一下(翻译可能很烂,请指正),让自己和共同爱好者有个更加直接明了的认识~

  • Silverlight学习笔记7(BS人人对战版中国象棋出炉)

    2009-12-15 15:00:00

    阅读: 117 评论: 0 作者: 牛仔不太忙 发表于 2009-12-15 14:20 原文链接 经过两个多月的断断续续的尝试和摸索,BS版的人与人对战中国象棋终于可以进行基本功能的测试

  • MOSS发生“未能转换部分或所有标识引用”错误的处理

    2007-9-25 23:51:00

    已经运行MOSS的服务,将服务器加入另一个域后,MOSS网站无法打开(更改域管理员帐户或密码应该也会有这个问题吧),一开始我以为原因很简单,改一下IIS应用程序池的运行帐户、windows服务中部分

  • 移动Web最佳实践 1.0 W3C [大纲]

    2009-10-23 14:08:00

    摘要: 这是w3c发布的Mobile Web Best Practices 1.0中的【Basic Guidelines】部分 由于本人外语水平和从业经验有限,文中难免纰漏和差错,望各位朋友

  • 善变者常新

    2009-4-28 13:21:00

    罗素说:“参差多态是幸福的本源”。我们的生活若能丰富多彩,每天都是新鲜的,就会觉得生活有滋有味,生命是有价值的,而我们的存在则是幸福而有意 义的。如果每天的生活都是在重复,人

  • Web server controls in ASP.Net - part 2

    2010-9-23 7:41:00

    In this second post of presenting the basic web server control in ASP.Net we will look into the Adr

  • ProMesh.NET: 开源的.net MVC框架

    2007-8-30 23:55:00

    如果你已经很习惯于微软提供的webform框架,熟练的拖放设置各个控件,现在不如尝试下 这个 开源的MVC框架,站在另外的角度审视我们每天使用MS给我们提供的标准框架,会得到不少的收获。