【ASP.NET MVC体系】管理浅谈ASP.NET MVC 路由

管理 1

 
路由的基本是一个万分简单的算法,该算法基于一个由RouteCollection类和RouteBase类组成的简短抽象对象。可以动用多种措施来生成URL,但这么些方法皆以调用RouteCollection.GetVirtualPath的一个重载方法而截至。RouteCollection.GetVirtulPath方法公有六个重载版本,下面的代码呈现它们的方法签名:

挂号 瑟维斯(Service)(Service) 有分二种办法:

管理 2

地点介绍完了Ocelot开发的基本原理,近年来Ocelot 由17 个Middleware
来形成,在每个Middleware的内部贯彻上还有涉及到很多政工的学问,本篇作品先不做展开,后续写实际的著作详细分析。接下来大家来说说什么样自定义增添,在我们的档次中重点在三个地点开展了扩张:

译文:默认情形下,路由不处理映射到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.

ASP.NET Core 传统的ASP.NET
在架设上有很大的改良,更加的模块化,下图形象的验证了他们中间区别,Application
和 Middleware 是一样的,比如ASP.NET Core
MVC也是一个Middleware,通过Middleware这样的构造大家非凡容易的扩充大家的应用程序。

管理 3

管理 4

      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.

管理 5

译文:

 管理 6

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.

 

译文:下边的以身作则显示了怎么利用MapPageRoute方法创制一条路线,该路由限制了所在和年参数中得以蕴涵的值。(在MVC应用程序中,您将采取map路由艺术。)

管理 7

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

  • Transient  每回注入时,都再一次 new 一个新的实体。
  • Scoped    每个 Request 都再也 new 一个新的实体。
  • Singleton 程序启动后会 new 一个实体。也就是运行期间只会有一个实体。

事例引入

Ocelot 默认补助基于IdentityServer4的验证,需要自定义表明,可以参考
https://github.com/TomPallister/Ocelot/pull/110,添加自定义的声明,不过.net
core 2.0 认证部分基本上重写了。

 译文:上边的例证显示了在大局中创立默认MVC路由的代码。asax文件,正如在Visual
Studio项目模板中定义的MVC应用程序。

管理 8

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

管理 9

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.

  • A 为 Singleton
  • B 为 Scoped
  • C 为 Transient

管理 10

管理 11

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

2、自定义扩张下游通讯协议

        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.

ocelot 有管理API,可以依据管理API 做自定义的保管控制台,github 有个
https://github.com/dbarkwell/Ocelot.ConfigEditor,这多少个体系落实了asp.net
core mvc 的在线编辑路由。

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

具体内容参考: ASP.NET Core HTTP
管道中的这个事儿

何以一分钟从头构建一个 ASP.NET Core
中间件

咱们在Middleware的编程过程中需要关爱HttpContext 以及管道的注册者和构建者
ApplicationBuilder。

     (4)  可以展现出站点布局;

下边这张图来源https://blog.johnwu.cc/article/asp-net-core-dependency-injection.html
,形象的以身作则了目的生命周期。

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

管理 12

译文:您可以经过包含常量来避免情势中的歧义,例如
annual/{report}/{year} and monthly/{report}/{year}/{month}。

管理 13

管理 14

管理 15

     (5)
 应该是“可破解的”,用户可以因而移除URL的最后,进而到达更高层次的信息连串布局;

  • Routing
    • 用户能够指定上游请求之间的映射,并将其转化到下游服务上的例外URL。
  • Service Discovery
    • Ocelot可以查阅你的劳动意识,并找到它应当转发下游请求的服务。它可以在这个劳务期间展开负载平衡。.
  • Authentication using IdentityServer

    • 您可以将端点标记为已注脚,并运用IdentityServer承载标记对你的用户展开身份验证.
  • Authorisation using Claims
    • 如果采纳 bearer tokens, 可以拔取 claims 标记特定
      endpoints是授权的
  • Claims Transformation
    • Ocelot提供了一种语法来更换给下游请求,并将宣示数据增长到题目,URL参数,其他讲明等等
  • Quality of service
    • Retries, circuit breaker, timeouts etc.
  • Request / Correlation Ids
  • Caching
  • Logging
  • Custom Middleware

设置教程如下:

Ocelot
默认襄助Http的通讯,在大家的实在项目中有众多老的劳务是RPC调用,使用的是个体的Relay通讯框架,在API网关上需要做协议转换,自动将Http的请求改换成Relay的tcp通讯。

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.

事情的急速发展,发生的可怜多的对外的劳务接口,分散在公司的相继地点需要进行合并的保管,而且大家的条件是linux和windows的混合环境,大家的靶子是统一在店堂的Linux环境,.NET
Core对于.NET 技术公司来说是一个非凡棒的技术,而且.NET
Core本身的架构分外好,性能就更好了。

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.

1、自定义扩充API 接口验证

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

ASP.NET Core 使用了大气的 DI (Dependency Injection)
设计,同样我们在Ocelot的宏图中也利用了汪洋的DI设计,具体参看源码https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs 

管理 16管理 17

自己在github上的地点https://github.com/geffzhang
欢迎互粉,Ocelot在github的地址 https://github.com/TomPallister/Ocelot
, 至极给力的是在科目当天做到了.NET Core
2.0的提拔,升级历程请看https://github.com/TomPallister/Ocelot/issues/114
。今日自家花了半钟头就把自身的此外一个POC项目Nanofabric  
https://github.com/geffzhang/NanoFabric 升级到了.NET Core 2.0,
这些POC项目也是我的分享的档次的原型,可以如此说.NET Core 2.0
三月份标准颁发,经过3
个月时间的迈入,社区生态已经都早就做好了备选,开发新项目可以采纳.NET
Core 2,Ocelot 是一个集成社区中过多突出开源项目标表示。

View
Code

Ocelot就是采纳Middleware来形成网关的有所机能,每个小功效就是一个Middleware,具体可以看代码
https://github.com/TomPallister/Ocelot/blob/develop/src/Ocelot/Middleware/OcelotMiddlewareExtensions.cs
,Ocelot 是何等把各类Middleware串起来共同完成一个API网关的效果。 asp.net
core 相当巧妙的计划,把Middleware抽象成了一个委托RequestDelegate,
ASP.NET Core 的每个 Request 都会经过每个所注册的 Middleware,Response
也是各类回传,以先进后出的不二法门处理每一个封包:

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

3、自定义管理控制台

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

更详尽的情节参看文档 https://github.com/TomPallister/Ocelot/wiki 

9   版权

上边介绍了Ocelot的意义特色,接下去我们进入介绍Ocelot
的贯彻原理分析,主题是是ASP.NET Core Middleware 以及 ASP.NET Core
DependencyInjection:

【04】Professional Asp.net MVC 5

管理 18

 在这一章节,紧要分析URL绑定到控制器操作的最底层细节,分析底层原理,了然ASP.NET请求管道。注意,近来路由不仅仅只是ASP.NET
MVC的一个表征了,它早已抢先这多少个限制,如ASP.NET Dynamic
Data。路由既不包括MVC的内部知识,也不依靠于MVC。

此间列出了Ocelot近期支撑的特性:

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.

管理 19

译文:下表呈现了默认的URL情势,它显示了由默认路由拍卖的URL请求的演示。

在微软Tech Summit 2017 大会上和我们大饱眼福了一门科目《.NET Core
在腾讯财付通的小卖部级应用开发执行》,其中第一是遵照ASP.NET
Core打造可扩大的高性能企业级API网关,以开源的API网关Ocelot为底蕴结合自己的政工特点,当天科目只有40分钟,有为数不少情节都并未展开,接下去就用一篇小作品来聊下Ocelot
的兑现原理,我们在行使的经过中也得以同步来贡献。 总体来说这是一个ASP.NET
Core
高级编程的内容,在此以前在群众号里已经发过不少各位朋友写的篇章,前几天都会在这篇作品中引用,让您更加深切学习。

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.

二义性Demo目录结构

可以包括为如下流程图:

2.11 How URLs Are Matched to
Routes(url咋样与路由分外)

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

/Controllers/RouteDemo

1 URI、URL与URN

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

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.

     URN(Uniform Resources
Name)代表联独资源名称,互联网上资源的称呼;

测试结果

译文:下边的演示彰显了来自.Globalasax文件的代码,该代码添加了一个路由对象,该目的定义了三个名为action和体系称号的URL参数。具有指定情势的url被定向到名为分类.aspx的大体页面。

4 路由绑定到操作

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

 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 }

2.1  WebForm URL与Route URL

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

8 参考文献

译文:您仍是可以够指定路由不应该处理某些URL请求。通过定义一条路由,并点名StopRoutingHandler类应该用于拍卖该形式,从而制止了拍卖某些请求的路由。当一个StopRoutingHandler对象处理请求时,StopRoutingHandler对象会卡住请求作为路由的此外附加处理。相反,请求是当做ASP.NET
页面来拍卖的,网络页面,Web服务,或任何ASP.NET端点。您可以运用 RouteCollection.Ignore方法。

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

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

  • 译文:您为路径所提供的别样约束。

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

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

  3.2  URL生成详解

 
译文:路线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.

 1.1 URI、URL和URN定义 

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

译文:有时你必须处理包含一个可变多少的URL段的URL请求,其中。当你定义一个路由时,您可以指定,假使一个URL的部分比情势中有更多的段,那么额外的段被认为是最后一片段的一片段。要以这种方法处理额外的段,您可以用星号(*)标记最终一个参数。这被称作一个含糊的参数。一个饱含所有参数的路由也将至极不含有最终一个参数的任何值的url。下面的演示呈现了一个匹配未知数量的段的路由形式。

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

View
Code

2.2  ASP.NET 路由与 URL 重写

7 总结

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.

1.5  小结

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

管理 20

在窗口中输入:Install-Package
routedebugger

 (4)然后路由系统接纳路由约束。

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.

 (2)路由体制查看要求的路由参数(即没有提供路由参数的默认值),并确保提供的路由值字典为每一个要求的参数提供一个值,否则,URL生成程序就会即刻终止,并赶回空值。

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.

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

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

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(字符串、字符串、字符串)方法。

下表显示了实惠的路由情势和与格局匹配的URL请求示例。

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

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

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

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

 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.

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

     
 平时状态下,URI代表同意资源标识符(Uniform Resource
Identifier)。URI是标识了一个资源的字符串。从技术角度看,所有URL都是URI。W3C认为“URL是一个非正式的概念,但它非常实惠:URL是URI的一种档次,它经过代表本身的首要性走访机制来标识资源”,换句话说,URI是某种资源的标识符,而URL则为拿到该资源提供了现实的音信。

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

行动是show.

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

管理 21

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

     (3)  便于输入;

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

   
调用GetRouteData方法会重返RouteData的一个实例。RouteData中包含了关于匹配请求的路由信息。

译文:假使你提供一个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.)

管理 22

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

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:

/ query / { queryname } { * queryvalues
}

 

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"}});
}

     (2)  简短;

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

RouteConfig.cs

管理 23

管理 24管理 25

 
 路由六个首要职责:匹配传入的URL请求和布局与一定路由对应的URL,概括之匹配URL和组织URL。在生成URL时,生成URL的意味应该率先与选拔用来生成URL的路由相匹配,这样路由就可以在拍卖传入或传播的URL时变成全体的双向系统。原则上,开发人士应该提供一组路由值,以便路由系统从中选中第一个能够匹配URL的路由。

 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 }

 

译文:当您定义一个路由时,您可以为一个参数指定一个默认值。假如该参数的值没有包含在URL中,则使用默认值。通过将dictionary对象分配给route类的默认属性,可以为路由安装默认值。下边的例证彰显了何等通过接纳MapPageRoute(字符串、字符串、字符串、布尔值、RouteValueDictionary)方法添加具有默认值的路由。

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

     (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片段将被解释为运用程序中的一个文件的路径。
  

管理 26

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

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

RouteConfig.cs

3 路由概述(特性路由)

译文:如若您提供一个字符串,那么路由将字符串作为一个正则表明式来拍卖,并透过调用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.

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

 从内容上来看,特性路由的内容与历史观路由差不多,同样有路由URL、路由值、控制器路由、路由约束和路由默认值等。鉴于篇幅限制,在此地就简单的概述一下,不作详细阐释,前期有时光或者有心上人需要,再论述。

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

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.

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

管理 27

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

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

控制器products.

 6.2 Class
Reference( 路由涉及到的基本点类)

Index

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

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

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

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

注:该例子没有插足区域

 

 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 }

 Typical URL Patterns in MVC
Applications

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

 3.1 URL生成的高层系概述

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

抑或也得以应用NuGet很有益的设置RouteDebugger,在品种方面右键-“Manage
NuGet Packages”-“Online”输入”RouteDebugger”然后”Install”.

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

2.6 Adding Routes to an MVC
Application

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);
    }
}

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

管理 28

1 @inherits System.Web.Mvc.WebViewPage
2 
3 <h2>RouteDebugger调试</h2>
 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                 

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

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

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.

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

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.

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

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

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

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

 

 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 }

2 路由概述(传统路由)

管理 29

  • 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.
  •  译文:您将它们增长到路由集合的逐条。

管理 30

自然, 你也足以团结下载RouteDebugger.dll,
引用到web项目中, 然后手动在web.config中投入

(5)路由非常成!现在可以因而查看每一个路由参数,并尝试运用字典中的对应值填充相应参数,进而生成URL。

 

6 与路由有关的基本点命名空间和类

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

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站点启用时,ASP.NET
路由也不处理请求。本有的讲述了一部分光景,其中路由不处理请求。

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.

 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 }

 由于篇幅有限,路由章节就写到这,当然,还有为数不少情节没写,如路由安排文件、路由平安设置、自定义路由约束等,留给读者朋友们去商讨吗。

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.

2.3  路由定义

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

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:

 4.1 高层次请求的路由管道

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

即便请求中缺失一个参数,则接纳默认值。由此,它们可以造成一条匹配您没有预料到的哀告的路由。例如,假若您添加了以下形式:

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

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.

译文:除了通过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.

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

2.12 路由二义性

/Controllers/NewFolder1/RouteDemo

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

 
(1)开发人士调用像Html.ActionLink或Url.Action之类的办法,这一个措施反过来再调用RouteCollection.GetVirtualPath方法,并向它传递一个RequestContext对象、一个涵盖值的字典以及用于采纳生成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)如若一个路由可以回复下边的题目(即匹配),那么它就会回去一个涵盖了URL的VirTualPathData实例以及任何匹配的消息。否则,它就回来空值,路由体制移向列表中的下一个路由。

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

途径1:报告/年/月,年和月默认值。

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

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

     (6)  持久、不可能改变

     (1)  域名便于回忆和拼写;

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

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.

id是bikes.

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  

   
 管理 31

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

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.

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

译文:如果您想要路由拍卖所有请求,甚至指向文件的伸手,您可以经过设置RouteCollection对象的性质RouteExistingFiles为true, 
以此来覆盖默认值。当你将这些值设置为true时,匹配定义形式的有所请求都由路由拍卖。

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

只在同一个缓解方案中,存在六个以及上述同等控制器下的相同action,当URL请求时,会冒出二义性。

2.4 URL Patterns(URL模式)

3 路由生成URL

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

 6.1  路由涉及的命名空间

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

   
如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属性保存着外面路由值。

管理 32

管理 33管理 34

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

 

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

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

译文:当路由拍卖URL请求时,它尝试将呼吁的URL与路由非凡。将URL请求匹配到路由取决于以下原则:

译文:通常地,在全局Global.asax文件中,您可以在一个叫做Application_Start
方法里添加路由。该方法确保当应用程序启动时,路由是能够使用的。它还使你可以在对应用程序举行单元测试时一贯调用该措施。假设你想在对应用程序举办单元测试时一直调用方法,那么注册路由的艺术必须是静态的(在Visual
Basic中是共享的),并且必须有所一个路由参数。

 管理 35

译文:在URL情势中,通过将它们封装在括号(以及)中来定义占位符。您可以在一个段中定义四个占位符,不过必须用文字值分隔它们。例如,语言-国家/行动是一种有效的途径形式。可是,语言国家/action不是一个管用的情势,因为占位符之间没有文字值或分隔符。因而,路由不可以说了算将语言占位符的值与国家占位符的值分隔开。

(1)路由集合通过RouteBase.GetVirtualPath方法遍历每个路由并走访:“可以变动给定参数的URL吗”,那些历程看似于在路由与传播请求匹配时所利用的匹配逻辑。

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

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

译文:约束是透过利用正则表达式或应用实现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.

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

 管理 36

 

管理 37

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

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

View
Code

译文:

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

5 路由调试

译文:当发出请求时,URL被解析为一些和占位符,且变量值被提供给请求处理程序。那多少个进程看似于查询字符串中的数据被解析并传递给请求处理程序的点子。在这二种意况下,变量音讯都包含在URL中,并以键值对的花样传递给处理程序。对于查询字符串,键和值都在URL中。对于路由,键是URL形式中定义的占位符名称,在URL中只有是值。

1.4 URL应持有特色

4.2 路由数据

RouteDemoController

管理 38

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注