请先看眼前的情节,有的人不想让旁人掌握自己文件的路子

事例引入

§8 URLs and Routing

Before ASP.NET MVC, the core assumption of routing in ASP.NET (just like
in many other web application platforms) was that URLs correspond
directly to files on the server’s hard disk. The server executes and
serves the page or file corresponding to the incoming URL. Table 8–1
gives an example

图片 1

这样, 限制会很多, 有的人不想让人家知道自己文件的门路,
或者是这个代表方法太为难了等等.

 

注:本文是【ASP.NET Web
API系列教程
】的一片段,假设你是首先次看本博客小说,请先看眼前的情节。

 先看看如下例子,你能一心通晓啊?

§8.1 Putting the Programmer Back in Control

ASP.NET MVC打破了这种范围, since ASP.NET MVC’s requests are handled by
controller classes (compiled into a .NET assembly), there are no
particular files corresponding to incoming
URLs.所以这也就不曾门路对应的特定文件了.

You are given complete control of your URL schema—that is, the set of
URLs that are accepted and their mappings to controllers and actions.
下边大家来探视mvc中是什么定义路径的.

图片 2

This is all managed by the framework’s routing
system.这全然是又框架的路线系统管理的.

 

§8.1.1 About Routing and Its .NET Assemblies

The routing system was originally designed for ASP.NET MVC, but it was
always intended to be shared with other ASP.NET technologies,
including Web Forms.路径系统本来是给mvc自己用的,
不过也会被此外asp.net技术使用.
所以路径代码是放在一个独门的程序集里(System.Web.Routing.dll in .NET
3.5, and simply System.Web.dll in .NET 4),而不是在System.Web.Mvc.dll
中.

 

4.1 Routing in ASP.NET Web API 4.1 ASP.NET Web API中的路由

正文引自:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

By Mike Wasson|February 11, 2012
作者:Mike Wasson | 日期:2012-2-11

This article describes how ASP.NET Web API routes HTTP requests to
controllers.
本著作描述ASP.NET Web API怎么着将HTTP请求路由到控制器。

If you are familiar with ASP.NET MVC, Web API routing is very similar to
MVC routing. The main difference is that Web API uses the HTTP method,
not the URI path, to select the action. You can also use MVC-style
routing in Web API. This article does not assume any knowledge of
ASP.NET MVC.
一旦您熟悉ASP.NET MVC,Web API路由与MVC路由特别像样。重要差异是Web
API使用HTTP方法而不是URI路径来接纳动作。你也得以在Web
API中利用MVC风格的路由。本文不假使你具备ASP.NET MVC的其他文化。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//特性路由
15 
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略资源文件
17 
18             routes.MapRoute(
19                 name: "Default",//路由名,唯一
20                 url: "{controller}/{action}/{id}",//路由URL
21                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },//路由URL默认值
22                 namespaces: new[] { "MVCDemo.Controllers" },//命名空间避免二义性
23                 constraints: new { id = @"^\d*$" }//约束
24 
25                 );
26         }
27     }
28 }

§8.2 Setting Up Routes

俺们来探视路径的布置, 在global.asax.cs文件里

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );
        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
        }
    }

When the application first starts up (i.e., when Application_Start()
runs), the RegisterRoutes() method populates a global static
RouteCollection object called RouteTable.Routes. That’s where the
application’s routing configuration lives. The most important code is
that shown in bold: MapRoute() adds an entry to the routing
configuration. To understand what it does a little more clearly, you
should know that this call to MapRoute() is just a concise alternative
to writing the following:当应用程序启动的时候,也就是Application_Start()鱼腥的时候, RegisterRoutes()静态方法会装入一个号称RouteTable.Routes的全局静态RouteCollection对象.
也是停放路径配置的地点.MapRoute是路径配置的进口, 为了简单的验证,
我们来举下面的事例

            Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(new
                {
                    controller = "Home",
                    action = "Index",
                    id = UrlParameter.Optional
                })
            };
            routes.Add("Default", myRoute);

大家地点的收看的这段代码和体系自动生成的这段代码是同等的.

图片 3

 

§8.2.1  Understanding the Routing Mechanism

The routing mechanism runs early in the framework’s request processing
pipeline. Its job is to take an incoming URL and use it to obtain an
IHttpHandler object that will handle the request.
早起的路由机制运作在框架的央求处理管道. 它的劳作就是运用进来的URL,
并用它来博取一个可知处理请求的的IHttpHandler 对象

Many newcomers to the MVC Framework struggle with routing. It isn’t
comparable to anything in earlier ASP.NET technologies, and it’s easy
to configure wrong. By understanding its inner workings, you’ll avoid
these difficulties, and you’ll also be able to extend the mechanism
powerfully to add extra behaviors across your whole
application.许多mvc框架的新手对路由的定义改到很困惑.
因为它和以往任何的asp.net技术不同,而且很容易配置错误.
通过打听它的中间运转,我们就足以防止这个题目,你也得以透过扩大额外的一言一行使全部应用程序拓展的更强大.

The Main Characters: RouteBase, Route, and RouteCollection

路由配置紧要有3个部分:

  • RouteBase is the abstract base class for a routing entry.
    You can implement unusual routing behaviors by deriving a custom
    type from it (I’ve included an example near the end of this
    chapter), but for now you can forget about it.
  • Route is the standard, commonly used subclass of RouteBase
    that brings in the notions of URL templating, defaults, and
    constraints. This is what you’ll see in most examples.
  • A RouteCollection is a complete routing configuration. It’s
    an ordered list of RouteBase-derived objects (e.g., Route
    objects).

How Routing Fits into the Request Processing Pipeline

When a URL is requested, the system invokes each of the IHttpModules
registered for the application. 当一个URL被呼吁,
系统调用每个在应用程序中早已登记的IHttpModules
.其中一个就是UrlRoutingModule

** 

The Order of Your Route Entries Is Important

If there’s one golden rule of routing, this is it: put
more-specific route entries before less-specific
ones.
如若有个路由安排的黄金规则: 那么就是将非常路径放在一般路径的前边.
因为系统的分外由的算法是从最上端初阶, 而不是找最契合的.

 

§8.2.2  Adding a Route Entry

默认的路由是很普通的, 假设你想要处理其他类其它URL, 你还索要做一些手脚.
我来举个大概的例证, 比如我们想要用URL /Catalog来查看这些连串的装有产品

            routes.Add(new Route("Catalog", new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(
                new { controller = "Products", action = "List" }
                )
            });

我们得以用地点的这段代码来兑现我们的目标. 它可以援助我们贯彻/Catalog
或者是 /Catalog?some=querystring, 可是 /Catalog/Anythingelse
这样的url是极度的.

 

URL Patterns Match the Path Portion of a URL

图片 4

 

Meet RouteValueDictionary

A different technique to populate a RouteValueDictionary is to
supply an IDictionary<string, object> as a constructor
parameter, or alternatively to use a collection initializer, as in the
following example:

            routes.Add(new Route("Catalog", new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary
                {
                    { "controller", "Products" },
                    { "action", "List" }
                }
            });

 

Take a Shortcut with MapRoute()

ASP.NET MVC adds an extension method to RouteCollection, called
MapRoute(). 你会发觉这比使用routes.Add(new Route(…)) 方便很多.

            routes.MapRoute("PublicProductsList", "Catalog",
                new { controller = "Products", action = "List" });

In this case, PublicProductsList is the name of the route entry.
It’s just an arbitrary unique string. That’s optional.

 

§8.2.3  Using Parameters

As you’ve seen several times already, parameters can be accepted via a
curly brace syntax. 正像你前面看到的, 参数可以置身{}里,
这里我们加一个color参数到路由中:

            routes.MapRoute(null, "category/{color}",
               new { controller = "Products", action = "List" });

This route will now match URLs such as /Catalog/yellow or
/Catalog/1234, and the routing system will add a corresponding
name/value pair to the request’s RouteData object. On a request
to /Catalog/yellow, for example, RouteData.Values[“color”] would be
given the value yellow
.

 

Receiving Parameter Values in Action Methods

You know that action methods can take parameters. When ASP.NET MVC
wants to call one of your action methods, it needs to supply a value
for each method parameter. One of the places where it can get values
is the RouteData collection. It will look in RouteData’s Values
dictionary, aiming to find a key/value pair whose name matches the
parameter name.

俺们领略action方法可以带参数. 当mvc想要调用一个action方法,
它需要提供一个value给艺术的参数. 它拿走value的一个地方就是RouteData
collection.
它会在RouteData’s
的键值对中检索一个和参数名对应的value.
So, if you have an action method like the following, its color
parameter would be populated according to the {color} segment parsed
from the incoming URL:

所以, 倘若你有个action方法像下边这样的,
那么它的color参数就在传播的url中的{color}中

        public ActionResult List(string color)
        {
            // Do something
        }

To be more precise, action method parameters aren’t simply taken
directly from RouteData.Values, but instead are fetched via the
model binding system, which is capable of instantiating and
supplying objects of any .NET type, including arrays and collections.
You’ll learn more about this mechanism in Chapters 9 and 12.
更准确的说,
action方法的参数不仅仅只是简短的一向从RouteData.Values获取.
而是从模型绑定系统中赢得,各类.net类型. 你会在第9章和12章中打听更多.

 

§8.2.4  Using Defaults

You didn’t give a default value for {color}, so it became a mandatory
parameter. The Route entry no longer matches a request for /Catalog.
You can make the parameter optional by adding to your Defaults object:
在下边的例子中, 我们从未给{color}一个默认值, 它成为了一个恐吓的参数.
路由入口不再匹配/Catalog 请求. 你能够

            routes.MapRoute(null, "Catalog/{color}",
                new { controller = "Products", action = "List", color = (string)null });

这般, 路由就能匹配/Category和/Category/orange了.

要是你想要一个非null 的默认值, 比如没有null的 int, 你可以显式的指定值

            routes.Add(new Route("Catalog/{color}", new MvcRouteHandler())
            {
                Defaults = new RouteValueDictionary(
                new { controller = "Products", action = "List", color = "Beige", page = 1 }
                )
            });

That’s a perfectly fine thing to do; it’s the correct way to set up
RouteData values that are actually fixed for a given Route
entry. For example, for this Route object,
RouteData[“controller”] will always equal “Products”, regardless
of the incoming URL, so matching requests will always be handled by
ProductsController.

这般,不管输入的url是何等, 匹配请求总会被ProductsController处理.

Remember that when you use MvcRouteHandler (as you do by default
in ASP.NET MVC), you must have a value called controller; otherwise,
the framework won’t know what to do with the incoming request and will
throw an error. The controller value can come from a curly brace
parameter in the URL, or can just be specified in the Defaults object,
but it cannot be omitted.

 

Creating Optional Parameters with No Default Value

就像默认的路由配置, 大家可以指定默认值UrlParameter.Optional.

            routes.MapRoute(null, "Catalog/{page}",
                new { controller = "Products", action = "List", page = UrlParameter.Optional });

这样, 当访问的URL有page值的时候, 我们就应用传入的vallue, 假如没有,
那么大家就不想action方法中传任何参数.你或许会纳闷,
为何不用0或者是null 作为默认参数, 上面是它的五个原因:

  • If your action method takes a page parameter of type int, then
    because that type can’t hold null, you would have to supply the
    default value of 0 or some other int value. This means the action
    method would now always receive a legal value for page, so you
    wouldn’t be able to control the default value using the MVC
    Framework’s [DefaultValue] attribute or C# 4’s optional
    parameter syntax on the action method itself (you’ll learn more
    about these in the next chapter).
  • 假诺您的action方法有个int类型的page参数,但是它是值类型,
    不可能是null. 所以你需要提供一个默认值(0或者是其他的值).
    这也认为着action方法总是需要一个法定的值, 所以,
    假设action方法本身行使mvc框架的[defaultvalue]特点或者是C#4的可选参数语法,
    你将无法控制它的类型.(你会在接下去的一章中询问更多)
  • Even if your action’s page parameter was nullable, there’s a
    further limitation. When binding incoming data to action method
    parameters, the MVC Framework prioritizes routing parameter values
    above query string values (you’ll learn more about value providers
    and model binding in Chapter 12). So, any routing value for
    page—even if it’s null—would take priority and hide any query
    string value called page.
  • 即时你的action的page参数可以是null类型. 这里还有个限制.
    当action方法的参数是binding类型的时候, mvc
    框架会将路由参数优先于查询字符串值.(你会在12章中学到值提供者和模型绑定).
    所以,
    任何为page设置的路由值–即便是null–也会优先于访问page的查询字符串

UrlParameter.Optional化解了这六个问题

 

§8.2.5  Using Constraints

有时候, 你会想要添加额外的标准化, 以分外特定的route. 比如:

  • 您想匹配get请求, 而不是post请求
  • 有的参数要配合特定的参数(e.g. ID参数必须配合数字类型)
  • 一对route用来匹配常规的web浏览器发来的央求,
    有的匹配iphone发来的同一URL

In these cases, you’ll use the Route’s Constraints property

 

Matching Against Regular Expressions

为了保证参数是数字类型的, 我们采纳这样的条条框框:

            routes.MapRoute(null, "Articles/{id}",
                new { controller = "Articles", action = "Show" },
                new { id = @"\d{1,6}" });

如此, route就会匹配 /Articles/1 和 /Articles/123456 这两序列型,
而不是其余的,(这里的正则表达式表示的是: 数字类型,1~6个)

 

Matching HTTP Methods

If you want your Route to match only GET requests (not POST
requests), you can use the built-in HttpMethodConstraint class (it
implements IRouteConstraint)—for example:

            routes.MapRoute(null, "Articles/{id}", 
                new { controller = "Articles", action = "Show" },
                new { httpMethod = new HttpMethodConstraint("GET") });

你想匹配什么样的HTTP方法, 就把它内置HttpMethodConstraint构造器中,
比如,new HttpMethodConstraint(“GET”, “DELETE”).

您要专注的是 HttpMethodConstraint[HttpGet] and
[HttpPost]
无关

 

Matching Custom Constraints

假定面前的二种都无法满意你, 那么你仍能实现它的.
举个例证,如果您想建立一个只允许web浏览器进入的路由入口,
你可以创设如下的束缚:

        public class UserAgentConstraint : IRouteConstraint
        {
            private string _requiredSubstring;
            public UserAgentConstraint(string requiredSubstring)
            {
                this._requiredSubstring = requiredSubstring;
            }
            public bool Match(HttpContextBase httpContext, Route route, string paramName,
            RouteValueDictionary values, RouteDirection routeDirection)
            {
                if (httpContext.Request.UserAgent == null)
                    return false;
                return httpContext.Request.UserAgent.Contains(_requiredSubstring);
            }
        }

下边的路由只好配合由iphone发起的伸手:

            routes.Add(new Route("Articles/{id}", new MvcRouteHandler()){
                Defaults = new RouteValueDictionary(new { controller = "Articles", action = "Show" }),
                Constraints = new RouteValueDictionary(
                    new { id = @"\d{1,6}", userAgent = new UserAgentConstraint("iPhone") }});

 

§8.2.6  Prioritizing Controllers by
Namespace

§8.2.7  Accepting a Variable-Length
List of Parameters

§8.2.8  Matching Files on the Server’s
Hard Disk

§8.2.9  Using IgnoreRoute to Bypass the Routing System

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{filename}.xyz");
    // Rest of routing config goes here
}

Here, {filename}.xyz is treated as a URL pattern just like in a normal
route entry, so in this example,
the routing system will now ignore any requests for /blah.xyz or
/foo.xyz?some=querystring. (Of course,
you must place this entry higher in the route table than any other
entry that would match and handle
those URLs.) You can also pass a constraints parameter if you want
tighter control over exactly which
URLs are ignored by routing.

这边{filename}.xyz 被用作一个URL模型, 就像一个一般的路由入口. 

Routing Tables 路由表

In ASP.NET Web API, a controller is a class that handles HTTP
requests. The public methods of the controller are called action
methods
or simply actions. When the Web API framework receives a
request, it routes the request to an action.
在ASP.NET Web
API中,一个控制器是处理HTTP请求的一个类。控制器的public方法称为动作方法action
methods
)或简称为动作action)。当Web
API框架接收到一个伸手时,它将以此请求路由到一个动作。

To determine which action to invoke, the framework uses a routing table.
The Visual Studio project template for Web API creates a default
route:
为了确定调用哪一个动作,框架使用了一个路由表routing
table
)。Visual Studio中Web API的门类模板会创制一个默认路由:

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

This route is defined in the WebApiConfig.cs file, which is placed in
the App_Start directory:
这条路由是在WebApiConfig.cs文件中定义的,该文件位于App_Start目录(见图4-1):

图片 5

图4-1. 项目中的WebApiConfig.cs配置文件

For more information aboout the WebApiConfig class, see Configuring
ASP.NET Web
API
.
关于WebApiConfig类的更多音讯参考“配置ASP.NET Web
API”(本课程系列的第10章 — 译者注)。

If you self-host Web API, you must set the routing table directly on the
HttpSelfHostConfiguration object. For more information, see
Self-Host a Web
API
.
假定要自托管(self-host )Web
API,你不可以不从来在HttpSelfHostConfiguration对象上安装路由表。更多新闻参考“自托管Web
API”(本课程序列的第8章 — 译者注)。

Each entry in the routing table contains a route template. The default
route template for Web API is “api/{controller}/{id}”. In this template,
“api” is a literal path segment, and {controller} and {id} are
placeholder variables.
路由表中的每一个条目都蕴涵一个路由模板route template)。Web
API的默认路由模板是“api/{controller}/{id}”。在那么些模板中,“api”是一个文字式路径片段,而{controller}和{id}则是占位符变量。

When the Web API framework receives an HTTP request, it tries to match
the URI against one of the route templates in the routing table. If no
route matches, the client receives a 404 error. For example, the
following URIs match the default route:
当Web
API框架接收一个HTTP请求时,它会打算按照路由表中的一个路由模板来匹配其URI。假如无路由相当,客户端会接收到一个404(未找到)错误。例如,以下URI与这一个默认路由的配合:

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

However, the following URI does not match, because it lacks the “api”
segment:
唯独,以下URI不匹配,因为它紧缺“api”片段:

  • /contacts/1

Note: The reason for using “api” in the route is to avoid collisions
with ASP.NET MVC routing. That way, you can have “/contacts” go to an
MVC controller, and “/api/contacts” go to a Web API controller. Of
course, if you don’t like this convention, you can change the default
route table.
注:在路由中利用“api”的原委是为了防止与ASP.NET
MVC的路由争辩。通过这种方法,可以用“/contacts”进入一个MVC控制器,而“/api/contacts”进入一个Web
API控制器。当然,假使您不希罕这种约定,可以修改这些默认路由表。

Once a matching route is found, Web API selects the controller and the
action:
假如找到了匹配路由,Web API便会选取相应的主宰和动作:

  • To find the controller, Web API adds “Controller” to the value of
    the {controller} variable.
    为了找到控制器,Web
    API会把“控制器”加到{controller}变量的值(意即,把URI中的“控制器”作为{controller}变量的值
    — 译者注)。
  • To find the action, Web API looks at the HTTP method, and then looks
    for an action whose name begins with that HTTP method name. For
    example, with a GET request, Web API looks for an action that starts
    with “Get…”, such as “GetContact” or “GetAllContacts”. This
    convention applies only to GET, POST, PUT, and DELETE methods. You
    can enable other HTTP methods by using attributes on your
    controller. We’ll see an example of that later.
    为了找到动作,Web
    API会考查HTTP方法,然后搜索一个名称以HTTP方法名先导的动作。例如,对于一个GET请求,Web
    API会查找一个以“Get…”起头的动作,如“GetContact”或“GetAllContacts”等。这种约定仅使用于GET、POST、PUT和DELETE方法。通过把注明属性运用于控制器,你可以启用另外HTTP方法。后边会看到一个例证。
  • Other placeholder variables in the route template, such as {id}, are
    mapped to action parameters.
    路由模板中的此外占位变量,如{id},被映射成动作参数。

Let’s look at an example. Suppose that you define the following
controller:
让我们着眼一个例证。假若你定义了以下控制器:

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

Here are some possible HTTP requests, along with the action that gets
invoked for each:
以下是一对恐怕的HTTP请求,及其将要被调用的动作:

HTTP Method
HTTP方法
URI Path
URI路径
Action
动作
Parameter
参数
GET api/products GetAllProducts (none)
(无)
GET api/products/4 GetProductById 4
DELETE api/products/4 DeleteProduct 4
POST api/products (no match)
(不匹配)

Notice that the {id} segment of the URI, if present, is mapped to the
id parameter of the action. In this example, the controller defines
two GET methods, one with an id parameter and one with no parameters.
注意,URI的{id}部分要是出现,会被映射到动作的id参数。在这么些事例中,控制器定义了多少个GET方法,其中一个分包id参数,而另一个不带参数。

Also, note that the POST request will fail, because the controller does
not define a “Post…” method.
此外要专注,POST请求是没戏的,因为该控制器未定义“Post…”方法。

注:该例子没有进入区域

Routing Variations 路由变异

The previous section described the basic routing mechanism for ASP.NET
Web API. This section describes some variations.
上一节讲述了ASP.NET Web API基本的路由机制。本小节描述一些形成。

1 URI、URL与URN

HTTP Methods HTTP方法

Instead of using the naming convention for HTTP methods, you can
explicitly specify the HTTP method for an action by decorating the
action method with the HttpGet, HttpPut, HttpPost, or
HttpDelete attribute.
代表用于HTTP方法的命名约定,可以一目了解地为一个动作指定HTTP方法,这是由此以HttpGetHttpPutHttpPostHttpDelete诠释属性对动作方法开展修饰来贯彻的。

In the following example, the FindProduct method is mapped to GET
requests:
在下列示例中,FindProduct方法被映射到GET请求:

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

To allow multiple HTTP methods for an action, or to allow HTTP methods
other than GET, PUT, POST, and DELETE, use the AcceptVerbs
attribute, which takes a list of HTTP methods.
要允许一个动作有六个HTTP方法,或同意对GET、PUT、POST和DELETE以外的此外HTTP方法,需利用AcceptVerbs(接收谓词)注明属性,它以HTTP方法列表为参数。

public class ProductsController : ApiController 
{ 
    [AcceptVerbs("GET", "HEAD")]   // 指示该动作接收HTTP的GET和HEAD方法 — 译者注
    public Product FindProduct(id) { } 

    // WebDAV method
    // WebDAV方法(基于Web的分布式著作与版本控制的HTTP方法,是一个扩展的HTTP方法 — 译者注)
    [AcceptVerbs("MKCOL")]   // MKCOL是隶属于WebDAV的一个方法,它在URI指定的位置创建集合
    public void MakeCollection() { } 
}

 1.1 URI、URL和URN定义 

Routing by Action Name 通过动作名路由

With the default routing template, Web API uses the HTTP method to
select the action. However, you can also create a route where the action
name is included in the URI:
采取默认的路由模板,Web
API使用HTTP方法来挑选动作。然则,也可以创设在URI中隐含动作名的路由:

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

In this route template, the {action} parameter names the action method
on the controller. With this style of routing, use attributes to specify
the allowed HTTP methods. For example, suppose your controller has the
following method:
在这些路由模板中,{action}参数命名了控制器上的动作方法。接纳那种风格的路由,需要使用讲明属性来指明所允许的HTTP方法。例如,如果你的控制器有以下方法:

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

In this case, a GET request for “api/products/details/1” would map to
the Details method. This style of routing is similar to ASP.NET MVC, and
may be appropriate for an RPC-style API.
在这么些事例中,一个对“api/products/details/1”的GET请求会映射到那一个Details方法。这种作风的路由类似于ASP.NET
MVC,而且或许与RPC式的API相类似。

You can override the action name by using the ActionName attribute.
In the following example, there are two actions that map to
“api/products/thumbnail/id”. One supports GET and the other supports
POST:
可以经过行使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); 
}

     URI(Uniform Resource
Identifier)代表统一资源标识符,标识资源的字符串;

Non-Actions 非动作

To prevent a method from getting invoked as an action, use the
NonAction attribute. This signals to the framework that the method
is not an action, even if it would otherwise match the routing rules.
为了防范一个措施被视作一个动作所请求,要动用NonAction诠释属性。它对框架发出信号:该措施不是一个动作,即便它可能与路由规则匹配。

// Not an action method.
// 不是一个动作方法
[NonAction] 
public string GetPrivateData() { ... }

     URL (Uniform Resource
Locator)代表统一资源定位符,互联网上专业资源的地方;

Further Reading 进一步读书

This topic provided a high-level view of routing. For more detail, see
Routing and Action
Selection
,
which describes exactly how the framework matches a URI to a route,
selects a controller, and then selects the action to invoke.
本论题提供了关于路由的共同体概述。更多细节参见“路由与动作选拔”(本学科体系的下一小节

译者注),它纯粹地讲述了框架如何把URI匹配到路由、怎么样抉择控制器、以及随后选拔动作举办调用。

看完此文如若觉得所有收获,恳请给个推荐

     URN(Uniform Resources
Name)代表统一资源名称,互联网上资源的称号;

 1.2 URI、URL和URN三者之间的关联图

图片 6

1.3 对URI、URL和URN三者之间解析

      本解析基于1.2
URI、URL和URN三者之间的关联图。

     
(1)从命名角度,URI标识资源且唯一,URL标识资源地址
,URN标识资源名称;

     
(2)从数学关系:URI=URL+URN+URL∩URN;很容易见到,URL一定是URI,但URI不自然是URL,同理,URN一定是URI,但URI不肯定是URN;

1.4 URL应享有特色

     (1)  域名便于记念和拼写;

     (2)  简短;

     (3)  便于输入;

     (4)  可以反映出站点布局;

     (5)
 应该是“可破解的”,用户可以通过移除URL的最终,进而到达更高层次的信息体系布局;

     (6)  持久、不可能改变

1.5  小结

     
 平常状态下,URI代表同意资源标识符(Uniform Resource
Identifier)。URI是标识了一个资源的字符串。从技术角度看,所有URL都是URI。W3C认为“URL是一个业余的概念,但它那么些实用:URL是URI的一体系型,它通过代表本身的首要走访机制来标识资源”,换句话说,URI是某种资源的标识符,而URL则为获取该资源提供了切实可行的信息。

     
 注释:资源是一个抽象概念,既可以指一个文件,也可以指方法调用的结果或服务器上的局部任何情节。

2 路由概述(传统路由)

2.1  WebForm URL与Route URL

   
 (1)WebForm中,对URL的不胫而走请求平日映射到磁盘上的大体文件,如.aspx文件。例如对http://server/application/Product.aspx?id=4的请求映射到名为Products.aspx文件,该文件包含代码和标记用于呈现对浏览器的响应,一般请求示过程抽象如下:

   
 图片 7

     (2)ASP.NET
MVC中,平常地,URL映射并非映射到实际磁盘上的情理文件,那是按照ASP.NET路由特性,首要有五个经过,即URL映射和URL生成(接下去讲解)。在ASP.NET路由中,您可以定义URL情势,该格局涵盖在处理URL请求时行使的值的占位符。在运作时,运用程序名称后边的URL部分依据你所定义的URL情势分析为离散值。例如,在呼吁http://server/application/Products/show/beverages时,路由分析器可以将值Products、show和beverages传递给请求的处理程序。相反,在一个不由URL路由管理的请求中,/Products/show/beverages片段将被解释为运用程序中的一个文件的路径。
  

2.2  ASP.NET 路由与 URL 重写

        ASP.NET 路由不同于其他 URL
重写方案。URL 重写通过在将请求发送到网页往日实际更改 URL
来处理传入请求。例如,一个应用 URL 重写的应用程序可能会将 URL 从 /Products/Widgets/ 更改为 /Products.aspx?id=4。此外,URL 重写平时没有相应的 API
来创设基于形式的 URL。在 URL 重写中,如若更改了 URL
形式,则必须手动更新包含原始 URL 的有着超链接。由于
ASP.NET 路由得以从 URL 提取值,所以拍卖传入请求时不更改
URL。就算非得创立一个 URL,则将参数值传递到为你生成 URL
的方法中。若要更改 URL
格局,请在某地方变动该形式,您在应用程序中开创的基于该形式的所有链接将自行使用新格局。

2.3  路由定义

        A route is a URL pattern that is mapped to a handler.
The handler can be a physical file, such as an .aspx file in a Web Forms
application. A handler can also be a class that processes the request,
such as a controller in an MVC application. To define a route, you
create an instance of the Route class by specifying the URL pattern, the
handler, and optionally a name for the route.

     
 译文:路由是一种被映射到某个处理程序的URL格局。处理程序可能是一个大体文件,如在WebForms运用程序中的aspx文件。处理程序也恐怕是一个甩卖请求的类,如MVC应用程序中的控制器。要定义路由,您可以透过点名URL形式、处理程序和途径的称号来创立路由类的实例。

      You add the route to the
application by adding the Route object to the static Routes property of
the RouteTable class. The Routes property is a RouteCollection object
that stores all the routes for the application.You typically do not have
to write code to add routes in an MVC application. Visual Studio project
templates for MVC include preconfigured URL routes. These are defined in
the MvcApplication class, which is defined in the
Global.asax file.

     
译文:你可以经过将路由对象添加到RouteTable类的静态路由属性中的格局将路由添加到应用程序中。路由属性是一个为应用程序存储所有路由的路由对象。在MVC应用程序中,您平日不需要编制代码来添加路由。VS项目模板为MVC包含了事先布置的URL路由。那一个都是在MvcApplication类中定义的,被定义在Global.asac
文件中。

2.4 URL Patterns(URL模式)

A URL pattern can contain literal values
and variable placeholders (referred to as URL
parameters). The literals and placeholders are located in segments of the URL which are delimited by the slash
(/) character.

译文:URL情势可能带有文字值和变量占位符(称为URL参数)。文字和占位符位于URL的片段中,由斜杠(/)字符分隔。

When a request is made, the URL is parsed
into segments and placeholders, and the variable values are provided to
the request handler. This process is similar to the way the data in
query strings is parsed and passed to the request handler. In both cases
variable information is included in the URL and passed to the handler in
the form of key-value pairs. For query strings both the keys and the
values are in the URL. For routes, the keys are the placeholder names
defined in the URL pattern, and only the values are in the URL.

译文:当发出请求时,URL被分析为一些和占位符,且变量值被提供给请求处理程序。这一个进程看似于查询字符串中的数据被分析并传递给请求处理程序的艺术。在这三种情状下,变量音信都蕴含在URL中,并以键值对的款型传递给处理程序。对于查询字符串,键和值都在URL中。对于路由,键是URL格局中定义的占位符名称,在URL中单单是值。

In a URL pattern, you define placeholders
by enclosing them in braces ( { and } ). You can define more than one
placeholder in a segment, but they must be separated by a literal value.
For example, {language}-{country}/{action} is a valid
route pattern. However, {language}{country}/{action} is not a valid pattern,
because there is no literal value or delimiter between the placeholders.
Therefore, routing cannot determine where to separate the value for
the language placeholder from the value for the country placeholder.

译文:在URL形式中,通过将它们封装在括号(以及)中来定义占位符。您可以在一个段中定义三个占位符,不过必须用文字值分隔它们。例如,语言-国家/行动是一种有效的门道情势。然则,语言国家/action不是一个使得的形式,因为占位符之间没有文字值或分隔符。由此,路由无法操纵将语言占位符的值与国家占位符的值分隔开。

The following table shows valid route
patterns and examples of URL requests that match the patterns.

下赞赏显了有效的路由情势和与情势匹配的URL请求示例。

图片 8

 Typical URL Patterns in MVC
Applications

译文:MVC运用程序中的经典格局

 URL patterns for routes in MVC
applications typically include {controller} and {action} placeholders.

译文:在MVC运用程序中,路由URL形式平日包含控制器和动作占位符。

When a request is received, it is routed
to the UrlRoutingModule object and then to the MvcHandler HTTP handler.
The MvcHandler HTTP handler determines which controller to invoke by
adding the suffix “Controller” to the controller value in the URL to
determine the type name of the controller that will handle the request.
The action value in the URL determines which action method to
call.

译文:当接过到一个请求时,它被路由到UrlRoutingModule对象,然后发送到MvcHandler
HTTP处理程序。MvcHandler
HTTP处理程序通过向URL中的控制器值添加后缀“控制器”来确定要调用哪个控制器,以确定控制器的门类名称,该控制器将拍卖请求。URL中的操作值决定调用哪个操作方法。

For example, a URL that includes the URL
path /Products is mapped to a controller named ProductsController. The value in the action parameter is the name of the action method that
is called. A URL that includes the URL path /Products/show would result in a call to the Showmethod of the ProductsController class.

译文:例如,一个包含URL路径  /产品
的URL映射到一个名为ProductsController的控制器。action参数中的值是调用的操作方法的称谓。一个含有URL路径
  /产品/show
 的URL会导致对ProductsController类的Showmethod的调用。

The following table shows the default URL
patterns, and it shows examples of URL requests that are handled by the
default routes.

译文:下称扬显了默认的URL情势,它显得了由默认路由拍卖的URL请求的示范。

 图片 9

The route with the pattern {resource}.axd/{*pathInfo} is included to prevent requests
for the Web resource files such as WebResource.axd or ScriptResource.axd
from being passed to a controller.

For IIS 7.0, no file-name extension is
needed. For IIS 6.0, you must add the .mvc file-name extension to the
URL pattern, as in the following example:

译文:带有形式资源的路由axd/pathInfo,被用于制止Web资源文件的伸手,例如WebResource,axd或ScriptResource传递到控制器。对于IIS
7.0,不需要任何文件名称扩张。对于IIS
6.0,您必须添加.mvc文件扩大名到URL形式中,如下边的例子:

 图片 10

 如在VS2013使用MVC模板创制项目时,自动生成类RouteConfig.

图片 11

2.5 Adding Routes to a Web Forms
Application(添加路由到WebForm运用程序)

In a Web Forms application, you create
routes by using the MapPageRoute(String, String, String) method of the
RouteCollection class. The MapPageRoute method creates a Route object
and adds it to the RouteCollection object. You specify properties for
the Route object in parameters that you pass to the MapPageRoute
method.

译文:在Web
Forms应用程序中,您能够动用路由精选类的MapPageRoute(字符串、字符串、字符串)方法创立路由。MapPageRoute方法创造一个路由对象并将其添加到RouteCollection对象。您能够在传递给MapPageRoute方法的参数中指定路由对象的习性。

Typically, you add routes in a method
that is called from the handler for the Application_Start event in the
Global.asax file. This approach makes sure that the routes are available
when the application starts. It also enables you to call the method
directly when you unit-test the application. If you want to call a
method directly when you unit-test the application, the method that
registers the routes must be static (Shared in Visual Basic) and must
have a RouteCollection parameter.

译文:经常地,在大局Global.asax文件中,您可以在一个叫做Application_Start
方法里添加路由。该方法确保当应用程序启动时,路由是可以选用的。它还使您可以在对应用程序进行单元测试时直接调用该办法。假如您想在对应用程序举行单元测试时一直调用方法,那么注册路由的法子必须是静态的(在Visual
Basic中是共享的),并且必须怀有一个路由参数。

The following example shows code from a
Global.asax file that adds a Route object that defines two URL
parameters named action and categoryName. URLs that have the specified
pattern are directed to the physical page named Categories.aspx.

译文:上边的示范映现了来自.Globalasax文件的代码,该代码添加了一个路由对象,该目的定义了五个名为action和体系称号的URL参数。具有指定格局的url被定向到名为分类.aspx的情理页面。

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx");
}

2.6 Adding Routes to an MVC
Application

 If you adopt the MVC convention of
implementing controllers by creating classes that derive from the
ControllerBase class and giving them names that end with “Controller”,
you do not need to manually add routes in an MVC application. The
preconfigured routes will invoke the action methods that you implement
in the controller classes.

译文:假设你通过成立从控制器基类派生的类来落实控制器的MVC约定,并给它们以“控制器”结尾的名目,那么您就不需要在MVC应用程序中手动添加路由了。预配置的路由将调用您在支配器类中实现的操作方法。

If you want to add custom routes in an
MVC application, you use the MapRoute(RouteCollection, String, String)
method instead of the MapPageRoute(String, String, String)
method.
译文:假若你想在MVC应用程序中添加自定义路由,您可以行使MapRoute(RouteCollection、String、String)方法,而不是MapPageRoute(字符串、字符串、字符串)方法。

The following example shows the code that
creates default MVC routes in the Global.asax file, as defined in the
Visual Studio project template for MVC applications.

 译文:下面的事例展现了在全局中开创默认MVC路由的代码。asax文件,正如在Visual
Studio项目模板中定义的MVC应用程序。

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name 
            "{controller}/{action}/{id}",                           // URL with parameters 
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

2.7 Setting Default Values for URL
Parameters(为URL参数设置默认值)

When you define a route, you can assign a
default value for a parameter. The default value is used if a value for
that parameter is not included in the URL. You set default values for a
route by assigning a dictionary object to the Defaults property of the
Route class. The following example shows how to add a route that has
default values, by using the MapPageRoute(String, String, String,
Boolean, RouteValueDictionary) method.

译文:当你定义一个路由时,您能够为一个参数指定一个默认值。尽管该参数的值没有包含在URL中,则运用默认值。通过将dictionary对象分配给route类的默认属性,可以为路由安装默认值。下边的例子呈现了什么样通过接纳MapPageRoute(字符串、字符串、字符串、布尔值、RouteValueDictionary)方法添加具有默认值的路由。

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx",
        true,
        new RouteValueDictionary 
            {{"categoryName", "food"}, {"action", "show"}});
}

When ASP.NET routing handles a URL
request, the route definition shown in the example (with default values
of food for categoryName and showfor action) produces the results that
are listed in the following table.

图片 12

For MVC applications, overloads of the
RouteCollectionExtensions.MapRoute method, such as
MapRoute(RouteCollection, String, String, Object, Object), enable you to
specify defaults.

2.8 Handling a Variable Number of Segments
in a URL Pattern(在URL格局中拍卖可变多少的段)

Sometimes you have to handle URL requests
that contain a variable number of URL segments. When you define a route,
you can specify that if a URL has more segments than there are in the
pattern, the extra segments are considered to be part of the last
segment. To handle additional segments in this manner you mark the last
parameter with an asterisk (*). This is referred to
as a catch-all parameter. A route with a
catch-all parameter will also match URLs that do not contain any values
for the last parameter. The following example shows a route pattern that
matches an unknown number of segments.

译文:有时你必须处理包含一个可变多少的URL段的URL请求,其中。当你定义一个路由时,您可以指定,假诺一个URL的局部比形式中有更多的段,那么额外的段被认为是最后一局部的一局部。要以那种艺术处理额外的段,您可以用星号(*)标记最终一个参数。这被称为一个暧昧的参数。一个蕴含所有参数的路由也将配合不包含最终一个参数的任何值的url。上边的以身作则显示了一个配合未知数量的段的路由情势。

/ query / { queryname } { * queryvalues
}

When ASP.NET routing handles a URL
request, the route definition shown in the example produces the results
that are listed in the following table.

译文:当ASP.NET路由拍卖一个URL请求时,示例中所示的路由定义产生了下表中列出的结果。

图片 13

2.9  Adding Constraints to
Routes(为路由添加封锁)

In addition to matching a URL request to
a route definition by the number of parameters in the URL, you can
specify that values in the parameters meet certain constraints. If a URL
contains values that are outside the constraints for a route, that route
is not used to handle the request. You add constraints to make sure that
the URL parameters contain values that will work in your
application.

译文:除了通过URL中参数的多寡来匹配URL请求外,还足以指定参数中的值满足特定的约束规范。假使一个URL包含的值超出了路由的束缚,那么该路由就不会被用于拍卖请求。您添加了有的束缚,以保证URL参数包含在你的应用程序中行事的值。
Constraints are defined by using regular
expressions or by using objects that implement the IRouteConstraint
interface. When you add the route definition to the Routes collection,
you add constraints by creating a RouteValueDictionary object that
contains the verification test. The key in the dictionary identifies the
parameter that the constraint applies to. The value in the dictionary
can be either a string that represents a regular expression or an object
that implements the IRouteConstraint interface.

译文:约束是由此采取正则表明式或行使实现IRouteConstraint接口的目的来定义的。当将路由定义添加到路由集合时,通过成立一个蕴含验证测试的RouteValueDictionary对象来丰硕约束。字典中的键标识约束应用到的参数。字典中的值能够是意味着正则表明式的字符串,也可以是促成IRouteConstraint接口的目的。
If you provide a string, routing treats
the string as a regular expression and checks whether the parameter
value is valid by calling the IsMatch method of the Regex class. The
regular expression is always treated as case-insensitive. For more
information, see .NET Framework Regular Expressions.

译文:假如你提供一个字符串,那么路由将字符串作为一个正则表明式来拍卖,并通过调用Regex类的IsMatch方法检查参数值是否有效。正则表明式总是被视为不区分轻重缓急写的。要询问更多信息,请参阅。净框架正则表明式。
If you provide an IRouteConstraint
object, ASP.NET routing checks whether the parameter value is valid by
calling the Match method of the IRouteConstraint object. The Match
method returns a Boolean value that indicates whether the parameter
value is valid.

译文:假若您提供一个IRouteConstraint对象,ASP.NET
路由通过调用IRouteConstraint对象的匹配方法,
以此来检查参数值是否有效。Match方法再次回到一个布尔值,该值表示参数值是否可行。
The following example shows how to use
the MapPageRoute method to create a route that has constraints that
limit what values can be included in the locale and year parameters. (In
an MVC application, you would use the MapRoute method.)

译文:下面的言传身教呈现了如何使用MapPageRoute方法创设一条路子,该路由限制了地区和年参数中可以涵盖的值。(在MVC应用程序中,您将采纳map路由艺术。)

 

 1 public static void RegisterRoutes(RouteCollection routes)
 2 {
 3     routes.MapPageRoute("",
 4         "Category/{action}/{categoryName}",
 5         "~/categoriespage.aspx",
 6         true,
 7         new RouteValueDictionary 
 8             {{"categoryName", "food"}, {"action", "show"}},
 9         new RouteValueDictionary 
10             {{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}}
11        );
12 }

When routing handles a URL request, the
route definition shown in the previous example produces the results that
are listed in the following table.

图片 14

 2.10 Scenarios When Routing Is Not
Applied(不应用路由时的面貌)

Under
some circumstances, ASP.NET routing does not handle a request even when
is enabled for the Web site. This section describes some scenarios in
which routing does not handle the request.

译文:在好几情状下,即便在Web站点启用时,ASP.NET
路由也不处理请求。本有的讲述了部分现象,其中路由不处理请求。

A Physical File is Found that Matches
the URL Pattern(找到与URL格局匹配的物理文件)

By default, routing does not handle
requests that map to an existing physical file on the Web server. For
example, a request for
http://server/application/Products/Beverages/Coffee.aspx is not handled
by routing if a physical file exists at Products/Beverages/Coffee.aspx.
Routing does not handle the request even if it matches a defined
pattern, such as {controller}/{action}/{id}.

译文:默认情状下,路由不处理映射到Web服务器上幸存物理文件的乞求。例如,假使存在 Products/Beverages/Coffee.aspx.物理文件,请求http://server/application/Products/Beverages/Coffee.aspx
不被路由拍卖。虽然它与已定义的形式相匹配,路由不处理请求,例如控制器/动作/id。
If you want routing to handle all
requests, even requests that point to files, you can override the
default behavior by setting the RouteExistingFiles property of the
RouteCollection object to true. When you set this value to true, all
requests that match a defined pattern are handled by routing.

译文:要是您想要路由拍卖所有请求,甚至指向文件的呼吁,您可以透过设置RouteCollection对象的性能RouteExistingFiles为true, 
以此来覆盖默认值。当你将这多少个值设置为true时,匹配定义形式的保有请求都由路由拍卖。

Routing Is Explicitly Disabled for a
URL Pattern(为URL格局显式禁用路由)

You can
also specify that routing should not handle certain URL requests. You
prevent routing from handling certain requests by defining a route and
specifying that the StopRoutingHandler class should be used to handle
that pattern. When a request is handled by a StopRoutingHandler object,
the StopRoutingHandler object blocks any additional processing of the
request as a route. Instead, the request is processed as an ASP.NET
page, Web service, or other ASP.NET endpoint. You can use the
RouteCollection.Ignore method  

译文:您还足以指定路由不应有处理某些URL请求。通过定义一条路由,并点名StopRoutingHandler类应该用于拍卖该模式,从而制止了处理某些请求的路由。当一个StopRoutingHandler对象处理请求时,StopRoutingHandler对象会阻塞请求作为路由的别样附加处理。相反,请求是作为ASP.NET
页面来处理的,网络页面,Web服务,或其他ASP.NET端点。您可以动用 RouteCollection.Ignore方法。

1 public static void RegisterRoutes(RouteCollection routes)
2 {
3   routes.Ignore("{resource}.axd/{*pathInfo}");
4 }

2.11 How URLs Are Matched to
Routes(url如何与路由极度)

When routing handles URL requests, it
tries to match the URL of the request to a route. Matching a URL request
to a route depends on all the following conditions:

译文:当路由拍卖URL请求时,它尝试将呼吁的URL与路由卓殊。将URL请求匹配到路由取决于以下条件:

  • The route patterns that you have
    defined or the default route patterns, if any, that are included in
    your project type. 

  • 译文:您已经定义的路由模式或默认的路由形式,要是有的话,它们包含在你的品各个类中。

  • The order in which you added them to
    the Routes collection.
  •  译文:您将它们增长到路由集合的一一。

  • Any default values that you have
    provided for a route.

  • 译文:您为某个路由提供的任何默认值。
  • Any constraints that you have
    provided for a route.

  • 译文:您为路径所提供的此外自律。

  • Whether you have defined routing to
    handle requests that match a physical file.

  • 译文:是否定义了路由来处理与物理文件匹配的请求。

For example, suppose that you add routes
with the following patterns:

译文:例如,如果您添加了以下形式:
   Route 1 is set to
{controller}/{action}/{id}

   译文:
路径1设置为{controller}/{action}/{id}
   Route 2 is set to
products/show/{id}

 
译文:路线2设置为 products/show/{id}
Route 2 will never handle a request
because Route 1 is evaluated first, and it will always match requests
that could also work for Route 2. A request for
http://server/application/products/show/bikes seems to match Route 2
more closely, but it is handled by Route 1 with the following
values:
controller is products.
action is show.
id is bikes.

译文:

路由2永远不会处理请求,因为路由1率先被匹配,它连接匹配可能在2号路径上行事的央求。请求http://server/application/products/show/bikes似乎比赛路线2更紧密,但它是由路线1以下值:

控制器products.

行动是show.

id是bikes.

Default values are used if a parameter is
missing from the request. Therefore, they can cause a route to match a
request that you did not expect. For example, suppose that you add
routes with the following patterns:
Route 1: {report}/{year}/{month}, with
default values for year and month.
Route 2: {report}/{year}, with a default
value for year.
Route 2 will never handle a request.
Route 1 might be intended for a monthly report, and Route 2 might be
intended for an annual report. However, the default values in Route 1
mean that it will match any request that could also work for Route
2.

译文:

假诺请求中不够一个参数,则采纳默认值。因而,它们得以导致一条匹配您没有预料到的央求的路由。例如,如果您添加了以下格局:

路线1:报告/年/月,年和月默认值。

路线2:报告/年,年默认值。

路由2永远不会处理请求。第1条可能是对准每月报告的,而路由2或者是本着年度报告的。可是,路由1中的默认值意味着它将匹配任何可能用于路由2的请求。

You can avoid ambiguity in the patterns
by including constants, such as annual/{report}/{year} and
monthly/{report}/{year}/{month}.
If a URL does not match any Route object
that is defined in the RouteTable collection, ASP.NET routing does not
process the request. Instead, processing is passed to an ASP.NET page,
Web service, or other ASP.NET endpoint.

译文:您可以通过包含常量来制止模式中的歧义,例如
annual/{report}/{year} and monthly/{report}/{year}/{month}。

比方URL不匹配在RouteTable集合中定义的其余路由对象,ASP.NET路由不处理请求。相反,处理被传送给一个ASP.NET
Page ,Web服务,或其余ASP.NET端点。

2.12 路由二义性

只在同一个化解方案中,存在多个以及上述同等控制器下的相同action,当URL请求时,会油可是生二义性。

二义性Demo目录结构

图片 15

RouteConfig.cs

图片 16图片 17

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
15 
16             routes.MapRoute(
17                 name: "Default", 
18                 url: "{controller}/{action}/{id}", 
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
20                 
21            );
22         }
23     }
24 }
25                 

View
Code

/Controllers/RouteDemo

图片 18图片 19

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return View();
16         }
17     }
18 }

View
Code

/Controllers/NewFolder1/RouteDemo

图片 20图片 21

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers.NewFolder1
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return Content("路由二义性测试");
16         }
17     }
18 }

View
Code

测试结果

图片 22

3 路由概述(特性路由)

 特性路由是在ASP.NET MVC
5中新增的,传统路由ASP.NET MVC 1中就有了。

 从内容上来看,特性路由的始末与观念路由差不多,同样有路由URL、路由值、控制器路由、路由约束和路由默认值等。鉴于篇幅限制,在此处就大概的概述一下,不作详细阐释,先前时期有时间或者有对象需要,再论述。

 定义:特性路由就是将路由URL定义在控制器上或控制器内的办法上,而不像传统路由将路由URL定义在RouteConfig.cs中。相比较如下

图片 23

 

图片 24

3 路由生成URL

 
 路由三个首要职责:匹配传入的URL请求和结构与一定路由对应的URL,概括之匹配URL和协会URL。在生成URL时,生成URL的趣味应该首先与接纳用来生成URL的路由相匹配,这样路由就可以在拍卖传入或传播的URL时改为整体的双向系统。原则上,开发人士应该提供一组路由值,以便路由系统从中选中第一个可以匹配URL的路由。

 3.1 URL生成的高层系概述

 
路由的为主是一个非常简单的算法,该算法基于一个由RouteCollection类和RouteBase类组成的简易抽象对象。能够使用多种艺术来生成URL,但那么些办法皆以调用RouteCollection.GetVirtualPath的一个重载方法而得了。RouteCollection.GetVirtulPath方法公有多少个重载版本,上边的代码显示它们的章程签名:

1  public  VirtualPathData GetVirtualPath(RequestContext requestContex,RouteValueDictionary values)
2 
3  public  VirtualPathData GetVirtualPath(RequestContext requestContex,string name,RouteValueDictionary values)

 第一个重载版本接受当前的RequestContext,以及由用户指定的路由值(字典)。

(1)路由集合通过RouteBase.GetVirtualPath方法遍历每个路由并访问:“可以扭转给定参数的URL吗”,那么些进程看似于在路由与传播请求匹配时所拔取的非凡逻辑。

(2)如若一个路由可以回复下面的题材(即匹配),那么它就会回去一个带有了URL的VirTualPathData实例以及任何匹配的音讯。否则,它就回到空值,路由体制移向列表中的下一个路由。

第二个重载接受三个参数,其中第二个参数是路由名称。在路由集合中路由名称是唯一的,也就是说,没有多少个例外的路由具有相同的称号。当指定了路由名称时,路由集合就不需要循环遍历每个路由,相反,它可以顿时找到指定名称的路由,并移向下边的步骤(2)。假诺找到的路由无法配合指定的参数,该措施就会回去空值,并且不再匹配其他路由。

  3.2  URL生成详解

 
(1)开发人士调用像Html.ActionLink或Url.Action之类的模式,这么些艺术反过来再调用RouteCollection.GetVirtualPath方法,并向它传递一个RequestContext对象、一个暗含值的字典以及用于选取生成URL的路由名称(可选参数)。

 (2)路由体制查看要求的路由参数(即没有提供路由参数的默认值),并保证提供的路由值字典为每一个渴求的参数提供一个值,否则,URL生成程序就会即时停止,并重返空值。

 (3)一些路由可能含有没有对应路由参数的默认值。如路由可能为category键提供默认值“pastries”,不过cateory不是路由URL的一个参数,这种境况下,倘诺用户传入的路由值字典为category提供了一个值,那么该值必须匹配category的默认值。

 (4)然后路由系统使用路由约束。

(5)路由异常成!现在得以经过查阅每一个路由参数,并尝试使用字典中的对应值填充相应参数,进而生成URL。

可以包括为如下流程图:

图片 25

 

4 路由绑定到操作

 在这一章节,紧要分析URL绑定到控制器操作的最底层细节,分析底层原理,精晓ASP.NET请求管道。注意,近期路由不仅仅只是ASP.NET
MVC的一个特色了,它已经领先这些范围,如ASP.NET Dynamic
Data。路由既不包括MVC的内部知识,也不依靠于MVC。

 4.1 高层次请求的路由管道

  当ASP.NET
拍卖请求时,路由管道紧要由以下几步组成:

 
 (1)UrlRoutingModule尝试使用在RouteTable中注册的路由匹配当前呼吁。

 
 (2)倘若RouteTable中有一个路由中标匹配,路由模块就会从匹配成功的路由中得到IRouteHandler接口对象。

 
 (3)路由模块调用IRouteHandler接口的GetHandler方法,并重返用来拍卖请求的IHttpHandler对象。

 
 (4)调用HTTP处理程序中的ProcessRequest方法,然后把要处理的呼吁传递给它

   (5)在ASP.NET
MVC中,IRouteHandler是MvcRouteHandler类的一个实例,MvcRouteHandler转而回到一个实现了IHttpHandler接口的MvcHandler对象。再次回到的MvcHandler对象重要用来实例化控制器,并调
       用该实例化的控制器上的操作方法。

4.2 路由数量

   
调用GetRouteData方法会重临RouteData的一个实例。RouteData中涵盖了有关匹配请求的路由信息。

   
如URL:{Controller}/{action}/{id}。当请求/albums/list/123传来时,该路由就会尝试匹配传入的呼吁,如若配合成功,它就创设一个字典,其中包含了从URL中分析出的音信。确切地讲,路由还会向Values字典中为URL中的每个路由参数添加一个键;对于传统路由{Controller}/{action}/{id},Values字典中应有至少含有七个键,分别是Controller,action和id,假使传入的URL是对/albums/list/123的乞请,路由就会分析该请求的URL,并为字典的键提供值。本例中,字典中“Controller”键的值为albums,”action”键的值为“list”,”id”键的值是“123”;对于特性路由MVC使用DataTokens字典来储存更规范的信息,而不是操作名称字符串。具体来说,它富含一个操作描述符列表,这个描述符直接指向路由匹配时可能使用的操作方法。对于控制器级其它特点路由,列表大校有持续一个操作。在所有MVC中都有拔取的RequestContext的RouteData属性保存着外面路由值。

5 路由调试

 
 使用RouteDebugger调试,启用RouteDebugger后,它会用一个DebuggerRouteHandler替换所有路由处理程序,DebugRouteHandler截获所有传入的央浼,并查询路由表中的每一个路由,以便在页面底部呈现路由的确诊数据和参数。为使用RouteDebugger,只需在VS的Package
Manager Console窗口中运用NuGet安装即可,命令Install-Package
routedebugger.。RouteDebugger包在添加Route
Debugger程序集的还要。也在web.config文件的appSettings节点中添加一个安装,用来打开或禁用路由调试。

<add key="RouteDebugger:Enable" value="true'>

 只要启用RouteDebugger,它就呈现从(在地点栏中)当前恳请URL中提取的路由数据。如此,可以在地方栏中输入各类URL,并查看输入的URL能与哪些路由异常,在页面底部,它还会显示一个暗含应用程序定义的所用路由列表,这样能够查阅定义的哪个路由可以与当前URL相匹配。

安装教程如下:

视图=>其他窗口=>程序包管理控制台

图片 26

在窗口中输入:Install-Package
routedebugger

图片 27

如故也足以利用NuGet很方便的安装RouteDebugger,在档次方面右键-“Manage
NuGet Packages”-“Online”输入”RouteDebugger”然后”Install”.

理所当然, 你也得以自己下载RouteDebugger.dll,
引用到web项目中, 然后手动在web.config中参预

<add key="RouteDebugger:Enabled" value="true" />

测试结果

RouteConfig.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//
15 
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
17 
18             routes.MapRoute(
19                 name: "Default",
20                 url: "{controller}/{action}/{id}",
21                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
22             );
23         }
24     }
25 }

RouteDemoController

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return View();
16         }
17     }
18 }

Index

1 @inherits System.Web.Mvc.WebViewPage
2 
3 <h2>RouteDebugger调试</h2>

 

图片 28

6 与路由有关的首要性命名空间和类

 6.1  路由涉及的命名空间

图片 29

 6.2 Class
Reference( 路由涉及到的重要类)

图片 30

 

7 总结

 由于篇幅有限,路由章节就写到这,当然,还有众多内容没写,如路由安排文件、路由平安设置、自定义路由约束等,留给读者对象们去探讨吗。

8 参考文献

 【01】https://msdn.microsoft.com/en-us/library/cc668201.aspx\#setting\_default\_values\_for\_url\_parameters

【02】http://www.cnblogs.com/willick/p/3343105.html

【03】https://msdn.microsoft.com/zh-cn/library/cc668201(v=vs.100).aspx

【04】Professional Asp.net MVC 5

【05】http://www.cnblogs.com/liangxiaofeng/p/5620033.html

【06】https://msdn.microsoft.com/en-us/library/cc668177.aspx

【07】https://msdn.microsoft.com/en-us/library/dd535620.aspx

【08】https://msdn.microsoft.com/en-us/library/cc668176.aspx

【09】https://msdn.microsoft.com/en-us/library/dd329551.aspx

【10】https://msdn.microsoft.com/en-us/library/system.web.routing.route.aspx

【11】https://msdn.microsoft.com/en-us/library/system.web.routing.pageroutehandler.aspx

【12】https://msdn.microsoft.com/en-us/library/system.web.mvc.mvcroutehandler.aspx

【13】https://msdn.microsoft.com/en-us/library/system.web.ui.page.routedata.aspx

【14】https://msdn.microsoft.com/en-us/library/bb398900.aspx

【15】https://msdn.microsoft.com/en-us/library/ee941656.aspx

 

9   版权

 

  • 感谢您的读书,若有不足之处,欢迎指教,共同学习、共同提高。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少一些随笔利用读书、参考、引用、抄袭、复制和粘贴等多种方法结合而成的,大部分为原创。
  • 如您喜爱,麻烦推荐一下;如你有新想法,欢迎指出,邮箱:2016177728@qq.com。
  • 可以转载该博客,但无法不知名博客来源。

相关文章