剖析Asp.Net Web API路由系统---WebHost部署方式
发布时间 - 2026-01-10 23:07:21 点击率:次上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的。还是以一个简单实例开头。

创建一个空的WebApi项目,在Global中注册路由信息:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//注册路由
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
}
}
创建一个名为Home的Controller:
public class HomeController : ApiController
{
// GET: api/Home
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET: api/Home/5
public string Get(int id)
{
return "value";
}
}
启动运行,在浏览器地址栏分别输入http://localhost:46351/api/home和http://localhost:46351/api/home/5,结果如下:
简单看了一下Asp.Net Web API的实例,下面我们开始剖析Asp.Net Web API的路由系统。
首先看一下在Asp.Net Web API中路由的注册方式,如下:
在这个路由注册过程中,隐藏了哪些操作呢?下面我们源码:
通过翻看源码可以看到,Asp.Net Web API中路由的注册实际上是通过调用HttpRouteCollection类型的扩展方法MapHttpRoute实现的,在MapHttpRoute方法里面,我们看到创建的路由对象通过调用HttpRouteCollection对象的Add方法保存了。而由于GlobalConfiguration的静态属性通过Configuration是HostedHttpRouteCollection类型以RouteTable.Routes为构造参数创建的,又因为HostedHttpRouteCollection类型是HttpRouteCollection类型的子类,在HostedHttpRouteCollection类型中,子类HostedHttpRouteCollection重写了父类型的Add方法和CreateRoute方法,如下图,所以,实际上创建出来的路由对象的类型为HostedHttpRoute,此路由对象放到全局路由表中保存了,从这里我们可以知道,保存到全局路由表中的路由对象的类型为HostedHttpRoute。那么,注册的路由对象放到全局路由表中保存有什么用呢,后续部分分析。
从上面源码可以看到,最后创建的路由对象是HostedHttpRoute类型,那么现在有个问题,我们在前面注册路由的时候,并没有指定RouteHandler和HttpHandler,它们是从哪里添加到路由对象中的呢?在创建HostedHttpRoute对象的过程中,又有哪些隐藏的秘密呢?我们下面继续查看源码:
通过上文的剖析,到目前为止,我们可以知道在Asp.Net Web API以WebHost方式寄宿时,注册的路由对象为HostedHttpRoute类型的实例,保存在全局路由表RouteTable.Routes中,而用于处理请求的RouteHandler和HttpHandler分别为HttpControllerRouteHandler类型的实例和HttpControllerHandler类型的实例。
注册完路由信息后,在Asp.Net Web API中是如何利用注册的路由信息进行路由的呢?会不会也是跟Asp.Net中一样通过一个HttpModule来实现的呢,我们启动程序看一下Global类中的Modules属性:
从上面截图可以清楚看到,在Asp.Net Web API以WebHost方式寄宿服务时,也是跟ASP.Net一样,通过UrlRoutingModule来实现路由的。从上一篇针对Asp.Net路由系统的剖析中,我们可以知道,Asp.Net是通过UrlRoutingModule对请求进行拦截后,然后从全局路由表中依次进行匹配以获取与请求Url匹配的RouteData进行后续处理的。在Asp.Net Web API中,从上文中我们知道了保存在全局路由表的路由对象是HostedHttpRoute类型的,下面我们继续剖析在Asp.Net Web API中最终是怎么获取到匹配的RouteData的。
在UrlRoutingModule中,RouteData是通过依次调用每个路由对象的GetRouteData方法获取的。在Asp.Net Web API中,由于路由对象的类型为HostedHttpRoute,下面我们来看看调用GetRouteData方法时发生了什么:
可以看到,在HostedHttpRoute中是通过属性OriginalRoute的GetRouteData方法获取RouteData的,由前文的剖析中,我们知道这个OriginalRoute属性是HttpWebRoute类型:
从上面剖析中可以看到,Asp.Net Web API以WebHost方式部署时,最终还是通过Asp.Net的路由系统完成匹配工作。不过有一定需要注意的是,由于在HttpWebRoute中对父类型的验证约束的方法进行了重写,所以对于约束的验证,Asp.Net Web API还是使用了自己的方式进行验证约束是否匹配:
最后,通过一系列的工作获取到了RouteData对象和包含在里面的RouteHandler、HttpHandler后,Asp.Net Web API就可以通过这些获取到的进行请求的处理和响应了。
总结:
通过上文的剖析,可以得出:在Asp.Net Web API以WebHost方式部署时,注册的路由是保存在全局路由表中的;在获取RouteData时,是通过Asp.Net路由系统的匹配规则进行路由匹配的,不过却实现了自己的约束验证规则。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# asp.net
# webapi
# 路由
# web
# api
# .net
# 为ASP.NET MVC及WebApi添加路由优先级
# 详解ASP.NET WEB API 之属性路由
# 路由表
# 可以看到
# 我们可以
# 自己的
# 子类
# 看一下
# 上一篇
# 来实现
# 创建一个
# 过程中
# 的是
# 存了
# 看了
# 有个
# 在这个
# 是怎么
# 又有
# 会不会
# 有一定
# 是从
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Mybatis 中的insertOrUpdate操作
如何在香港服务器上快速搭建免备案网站?
免费视频制作网站,更新又快又好的免费电影网站?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel怎么调用外部API_Laravel Http Client客户端使用
如何批量查询域名的建站时间记录?
如何确保FTP站点访问权限与数据传输安全?
清除minerd进程的简单方法
微信小程序 五星评分(包括半颗星评分)实例代码
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel如何使用模型观察者?(Observer代码示例)
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
浅述节点的创建及常见功能的实现
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
lovemo网页版地址 lovemo官网手机登录
jQuery 常见小例汇总
如何构建满足综合性能需求的优质建站方案?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel如何实现数据库事务?(DB Facade示例)
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何快速搭建高效服务器建站系统?
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
如何用JavaScript实现文本编辑器_光标和选区怎么处理
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何基于云服务器快速搭建网站及云盘系统?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
如何在新浪SAE免费搭建个人博客?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何用PHP快速搭建高效网站?分步指南
用v-html解决Vue.js渲染中html标签不被解析的问题
大连网站制作公司哪家好一点,大连买房网站哪个好?
利用python获取某年中每个月的第一天和最后一天
如何在IIS7中新建站点?详细步骤解析
无锡营销型网站制作公司,无锡网选车牌流程?
IOS倒计时设置UIButton标题title的抖动问题
Python结构化数据采集_字段抽取解析【教程】
如何登录建站主机?访问步骤全解析
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Claude怎样写约束型提示词_Claude约束提示词写法【教程】

