此配置节的做用就是往Web程序中添加URL的映射,从而达到用户访问映射后的URL(如/Page/AAA)也能访问到源URL(如/Page/PageAAA.aspx)的效果。这也是URL映射原本的做用。 web
详细配置以下 网络
其中要启用这个URL映射的必需要把enabled设置成true,add和remove的url都是映射后的URL。 app
最开始鄙人是在WebForm中尝试,结果是成功的;而后担忧在MVC下已经废弃了,最开始多是某些缘由致使映射不了,直接说找不到URL,后来估计打断点查看一下两个应用程序(WebForm和MVC)的Application里面都包含了UrlMappingsModule。再接着在MVC下尝试,也不知啥缘由就映射成功了。然而也发现实际上这个URL映射就是ASP.NET的HTTP管道里面的这个模块起的做用。 工具
对于无知的我,让我去实现一个UrlMappingsModuel实现映射的话,多半会利用HttpResponse的Redirt经过URL重定向来从表面实现上达到这个URL映射的效果。之前刚开始学习ASP.NET的时候就以为HttpResponse的Redirt就是页面跳转,了解到Http协议的时候才发现这两个仍是有区别的。 学习
先弄一个重定向的例子,有一个Action他是重定向到另外一个Action——HelloWorld里面 url
当访问这个RedHelloWorld的时候,经过谷歌的开发者工具看到网络请求是这样子的 spa
页面最终是访问到HelloWorld。但是这并不是是请求RedHelloWorld的响应,其响应如上图,状态码302表示重定向,经过Location里面的"/Home/HelloWorld"字段来再次发起请求,最终显示的页面是HelloWorld的响应内容。 3d
(这一会儿成了在说HTTP协议的,档次以为下降了不少) orm
再看看URL映射的,在Web.Config中添加以下配置 blog
访问/Abc/aaa的时候呈现的是/Home/Index的内容,其响应头是这样子的200 OK
为此我也专门看了一下源码,首先web.config里面的配置确定是由某个以Section为后缀的配置读取类来获取,那这里的就是UrlMappingsSection。它读取了整个映射信息后会把它们存放到一个以UrlMappingCollection为类型、名为UrlMappings的集合里面
这个集合会在两个地方被使用,一个是UrlMappingsModule,另外一个是在ApplicationStepManager里面。这个ApplicationStepManager的具体做用我就没去认真探究,但经过HttpApplication里面的一点代码推测,这是在经典模式下使用的,另外一个管道的应该是对应集成模式。这里若是我说错了其余大神能够拍砖,我很是乐意更改过来。
那说回UrlMappingsModule里面的,他是注册了HttpApplication的BeginRequest事件,每当有请求来的时候他都会把要请求的URL拿过去UrlMappings比对一下看存不存在映射,
若是存在了,那就调用HttpContext里面的RewritePath方法去重写此次请求的路径,这个RewritePath是一个公共的方法
而对于HttpResponsed它就在响应头里面把状态码改为301或302,而后注明Location字段,下图节选自HttpResponse的内部方法Redirect重载。
实际上还有另外一种响应方式的,他是与WebForm那边有关系的,在使用MVC的时候就用不着了