ASP.NET Web API 路由

路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的是利用注册的路由表(RouteTable)对请求的URI进行解析以确定目标HttpController和Action的名称,以及与目标Action方法某个参数进行绑定的路由变量。

ASP.NET Web API框架是一个独立于传输层的抽象消息处理管道,其本身并不具有传输协议的侦听、接收和响应能力。
WebHost和SelfHost这两种典型的寄宿模式采用两种截然不同的机制实现了ASP.NET Web API路由系统的适配。

ASP.NET Web API 包含路由系统在内的核心框架是一个独立于寄宿环境的消息处理管道,这是为什么它能支持多种不同寄宿模式的根源所在。服务寄宿的目的在于提供一个运行环境以监听并接收来自外界的请求,并将请求适当加工后递交给这个抽象的消息处理管道进行处理,最后将管道处理后生成的响应利用网络传输返回给客户端。对于WebHost来说,真正的路由功能是由ASP.NET自身的路由系统来完成的。ASP.NET MVC的路由完全是由ASP.NET路由系统来完成的,但后者并非专门为MVC而设计,其实它最初是为了帮助Web Forms应用实现“请求地址与物理文件的分离”而设计的。

一个简单的例子来注册ASP.NET路由映射

这个Route的注册包括了:映射URI各段(Segment)的默认值,值的约束以及其它一些附加数据。

 1 using System;
 2 using System.Web;
 3 using System.Web.Routing;
 4 
 5 namespace WebHost
 6 {
 7     public class Global : HttpApplication
 8     {
 9         protected void Application_Start(object sender, EventArgs e)
10         {
11             // 设置路由映射URI各段的默认值
12             var defaults = new RouteValueDictionary
13             {
14                 {"areacode", "010"}
15             };
16 
17             // 设置值的约束
18             var constrains = new RouteValueDictionary
19             {
20                 {"areacode", @"0d{2,3}"},
21                 {"days", @"[1-3]"}
22             };
23             
24             // 设置附加数据
25             var dataTokens = new RouteValueDictionary
26             {
27                 {"defaultCity", "BeiJing"},
28                 {"defaultDays", "2"}
29             };
30             
31             // 在路由表中注册路由(Friendly URL与物理文件分离)
32             RouteTable.Routes.MapPageRoute("default", "{areacode}/{days}", "~/weather.aspx", false, defaults, constrains, dataTokens);
33         }
34     }
35 }

写一个WebForm页面来呈现上述的各种路由数据

 1 using System;
 2 using System.Web.UI;
 3 
 4 namespace WebHost
 5 {
 6     public partial class Weather : Page
 7     {
 8         protected void Page_Load(object sender, EventArgs e)
 9         {
10             if (!IsPostBack)
11             {
12                 if (RouteData.Route != null)
13                 {
14                     Response.Write(RouteData.Route.GetType().FullName);
15                     Response.Write("<br/>");
16                 }
17                 if (RouteData.RouteHandler != null)
18                 {
19                     Response.Write(RouteData.RouteHandler.GetType().FullName);
20                     Response.Write("<br/>");
21                 }
22                 Response.Write("<b>RouteData Values:</b></br>");
23                 foreach (var variable in RouteData.Values)
24                 {
25                     Response.Write($"<li>{variable.Key}={variable.Value}</li>");
26                 }
27                 Response.Write("<b>RouteData DataTokens:</b>");
28                 foreach (var variable in RouteData.DataTokens)
29                 {
30                     Response.Write($"<li>{variable.Key} = {variable.Value}</li>");
31                 }
32             }
33         }
34     }
35 }

运行结果

原文地址:https://www.cnblogs.com/frankyou/p/4702631.html