前言当一个Http请求发送给一个aspx页面时服务器进行了哪些操作?又如何来解析这个请求?ASPNET在接收请求后是怎么运行的如怎么编译以及怎么样用托管的代码来运行的?……理解这些问题使我们可以更加好的开发ASPNET
当我们在浏览器中请求一个ASPNET网站的某个页面的时候如我们在浏览器中输入x这个请求就被发送到了服务器(当然了这个网站是部署在IIS中的)当请求到达了服务器之后那么IIS就开始进行一系列的操作注意不是每个请求都一定会由ASPNET来运行处理的大家稍后就会明白为什么
在IIS中有一个组件httpsys其实这个组件的作用很简单就是验证请求的url如之前的x如果请求的URL不符合httpsys的要求那么这个请求就不会被传递给ASPNET的处理程序这样就在IIS这道门槛这些阻止了不合法的url请求这样ASPNET就不用处理这个不合法的请求就减轻了服务器的压力
下面我们就来看看这个httpsys到底是怎么样处理请求的url的当大家明白这个问题后就可以帮助我们解决很多的以前遇到的问题
首先请大家看看下面的图
当发送一个请求来请求页面的时候httpsys就会检查这个请求的url和headers的总的大小包含检查url中有关查询字符串的大小如demoaspx?username=demo也会检查cookie的大小把这些所有的加起来看看它们是否超过了KB如果超过了请求就失败了所以请求根本就没有传递给ASPNET
而且在httpsys检查url的时候也有很多的要求的如我们之前的那个url
x
这个url是由localhostDemoaspx这些路径的片段组成的每一个由/分割的字符串都是一个路径片段本例中就有两个路径片段在默认情况下httpsys要求一个url的路径片段不超过个并且每个路径片段的大小也不要超过个字母但是注意如果在Demoaspx后面有查询字符串Demoaspx?page=那么这个片段就可以超过个字母的限制即Demoaspx?page=可以更大但是不管怎么样这些url的大小如之前所说的不能超过KB如果没有通过httpsys的要求IIS就发送一个的错误
之前也说了的那是默认的这只其实这些设置我们是可以在注册表中改的但是默认设置已经很不错了所以一般没有必要改
当请求的url通过了httpsys的检查后请求就会传递给aspnet_filterdll下面简称filter
其实这个filter做两件事将url中的无cookie的票据转换为Http Headers保护ASPNET的相应的目录
首先来看看第一个作用检查url中的无cookie信息并且转换为Http Headers
大家应该明白ASPNET中的新特性-支持无cookie即cookieless因为我们在进行验证的时候一般是基于Forms验证而这种验证方式是把信息保存在cookie中的但是有的用户的浏览器是禁用了cookie的所以为了使得我们可以继续用这个验证方式就把验证信息保存为无cookie大家可以去查看有关这方面的资料来看看下面的一个url
//localhost/demo/(S(tuucnixfzjxqxmnqdg))/Defaultaspx
我们其实把有关的信息存储在了url中如上面的S就标识在后面括号()的信息就是无cookie的信息(tuucnixfzjxqxmnqdg)
来看看S是什么
S—Cookieless ticket for session state
A—Cookieless ticket for anonymous identification
F—Cookieless ticket for forms authentication
其实filter并不知道这些标识(如S)的意义只是filter检查url中是否包含这些标识并且这些标识后面还有()如果在url中检查到有这些标识那么filter就把这些标识转换为Http Headers并且在url中删除这些标识我们本来请求的是x页面但是如果filter不删除标识那么我们请求//localhost/demo/(S(tuucnixfzjxqxmnqdg))/Defaultaspx是不存在的就会返回一个错误(找不到请求的文件)
现在我们来看看filter的第二个作用的保护ASPNET的相应的目录
在我们开发的ASPMET网站中有很多的文件目录是不允许访问的如我们存放数据的App_DataApp_Code等所以filter就会检查请求的url中是否包含这样的字符//localhost/demo/App_Code/…一旦发现有这样的字符串出现甚至是以App_开发的任何字符串如App_MyFolder这个请求就会被拒绝了但是假如你的项目中已经有一个这样的以App_命名的目录如果你非要可以访问这样的目录可以在注册表中修改设置HKEY_LOCAL_MACHINE\Software\Microsoft\ASPNET
今天就写到这些下篇接着讲述