控制器 - URL routing HTTP module(一)

简介: URL routing HTTP module 负责处理检查入站请求的 URL,并将它们分派到最合理的处理器上。URL routing HTTP module 也替代了旧版本的 ASP.NET URL 重写特性。

URL routing HTTP module 负责处理检查入站请求的 URL,并将它们分派到最合理的处理器上。URL routing HTTP module 也替代了旧版本的 ASP.NET URL 重写特性。核心方面,URL 重写由 连接请求,转换原始 URL,指导 HTTP 运行时环境处理一个“最可能相关但存在区别”的 URL 这几个部分组成。

替代 URL 重写

如果我们需要在路由可读性、面向搜索引擎友好和需要以编程的方式处理若干的 URLs 方面上做权衡,那么,URL 重写就发挥作用了。比如,我们考虑以下 URL:

http://northwind.com/news.aspx?id=1234

news.aspx 页面包含了一些逻辑需要检索,格式化,并且显示相应新闻。特定新闻编号的检索通过查询字符串中的参数提供。作为一名开发者,实现这样的页面并非很容易,首先获得查询字符串的参数,然后执行查询,最后创建 HTML 页面,可是你也并非非常容易地记住这些 URL 地址。

然而 URL 重写可以在两个方面帮助你。第一,它让开发者使用通用的面向前端的页面成为可能,比如 news.aspx,来展示相关的内容。第二,它让用户访问更加友好的 URL 成为可能,这些 URL 都是通过编程的方式映射到敏感度降低但是更加易于管理的 URL 上。简单来说,URL 重写的存在就是为了降低请求的 URL 与处理请求的物理页面的耦合度。

在上个版本的 ASP.NET 4 Web Forms 中,你可以通过 URL 重写来匹配入站 URL 到其他的 URL 上,而非使用 HTTP 302 重定向的代价。相反的,在 ASP.NET MVC 里,URL 路由的目标就是将入站 URL 映射到对应的控制器和对应的行为方法上。

注意: URL routing module 原本开发为 ASP.NET MVC 的一个组件,但现在是 ASP.NET 平台一个原生的部分,正如上面所提,它同时向 ASP.NET MVC 和 ASP.NET Web Forms 应用提供服务,虽然通过一个稍微有点差别的 API.

路由请求

当一个请求到达 IIS 究竟发生了什么?

URL routing module 为应用拦截任何无法被 IIS 处理的请求。如果这个 URL 指向一个物理文件(比如,一个 ASPX 文件),routing module 就会忽略这个请求,除非这个 URL 被特别配置过。然后这个请求就会落到传统的 ASP.NET 机制上并被处理,也就是 page handler。

相反的,URL routing module 会尝试将请求 URL 与应用定义好的路由经行匹配。如果匹配成功,这个请求就会进入 ASP.NET MVC 空间并被处理。如果没有匹配成功,这个请求就会被标准的 ASP.NET 运行时所处理,并且很可能导致 HTTP 404 错误的显示。

最后,仅有那些匹配预先定义的 URL 模式的请求可以进入 ASP.NET MVC 运行时。所有的这些请求将会被路由到一个公共的 HTTP handler 上,它可以实例化一个控制器类并调用它当中的定义好的方法。然后,这个控制器中的方法,反过来会选择一个视图组件,并生成响应。

URL routing module 内部结构

依据实现原理,URL routing 引擎是一个封装了 PostResolveRequestCache 事件的 HTTP 模块。这个事件会在如果 ASP.NET 缓存中没有对应请求的响应时立即被启动。

HTTP module 将请求的 URL 与一个用户自定义的 URL 路由匹配,设置 HTTP context,并使用 ASP.NET MVC 标准 HTTP handler 处理请求。作为一个开发者,我们并不太可能直接与 URL routing module 打交道。这个模块由系统直接提供,并且你也不需要做相应形式的配置。然后,你有义务为你的应用提供相应的路由,而这个将会被 routing module 使用到。 

  

【声明:本文是个人翻译而来。当中可能会存在许多不当之处,万望指出,谢谢。文章会持续更新】

相关文章
|
2月前
|
Ubuntu Linux iOS开发
问题./configure: error: the HTTP gzip module requires the zlib library.处理
问题./configure: error: the HTTP gzip module requires the zlib library.处理
727 6
|
1月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
url重写重定向所有http网址到https网址
url重写重定向所有http网址到https网址
40 4
|
2月前
|
安全 Java 程序员
【HTTP】认识 URL 和 URL encode
【HTTP】认识 URL 和 URL encode
44 0
|
4月前
|
iOS开发 MacOS Python
【Mac 系统】解决已有清华镜像但出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url
在尝试使用清华镜像创建conda环境时遇到下载超时问题,通过删除原有镜像并添加针对Mac OS的清华镜像解决了该问题。
140 3
|
4月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
4月前
|
存储 Linux Docker
Could not fetch/save url https://download.docker.com/linux/centos/docker-ce.repo
CentOS 安装Docker时,将 Docker 官方的 YUM 存储库添加到 CentOS 系统中出现错误。
731 0
|
6月前
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
107 5
|
6月前
|
JavaScript
【干货】js判断url是否是合法http/https
【干货】js判断url是否是合法http/https
|
6月前
|
JavaScript
vue : 无法加载文件 D:\module\npm_module\npm_modules\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.c
vue : 无法加载文件 D:\module\npm_module\npm_modules\vue.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.c