惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
Check Point Blog
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
IT之家
IT之家
月光博客
月光博客
U
Unit 42
K
Kaspersky official blog
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
云风的 BLOG
云风的 BLOG
酷 壳 – CoolShell
酷 壳 – CoolShell
I
InfoQ
Engineering at Meta
Engineering at Meta
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Security @ Cisco Blogs
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
Schneier on Security
S
Secure Thoughts
The Register - Security
The Register - Security
B
Blog RSS Feed
The Last Watchdog
The Last Watchdog
P
Palo Alto Networks Blog
爱范儿
爱范儿
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 热门话题
C
Cisco Blogs
Spread Privacy
Spread Privacy
F
Full Disclosure
博客园 - 聂微东
T
The Blog of Author Tim Ferriss

博客园 - lemontree

SQL SERVER学习计划 新的开始 C#.NET禁止一个程序启动多个实例 - lemontree - 博客园 MDI窗体,子窗体在父窗体中最大化,如果子窗体已经打开则显示,不重复打开窗体 winform里c#验证用户正确后 怎么打开新窗口时关闭登陆窗口 Are You Going To Scarborough Fair中文歌词 安装VS2005 SP1失败 (转载)浅析HTTP协议 (转载)你是合格的程序员吗?—合格程序员应该具备的12种能力 夯实基础,从HTML开始 SQLserver2000〔Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server不存在或访问被拒绝 压缩数据库日志文件 RDLC报表(一) [转载]OWC做电子表格和图表的试验 .net 2.0 Configuration Error seo专题之开篇有益 引用Microsoft.Office.Interop.Excel出现的问题 OWC生成Excel的效能优化 妇女节各人的不同回复
浅谈ASP.NET的内部机制(一)
lemontree · 2009-03-11 · via 博客园 - lemontree

转自:http://www.cnblogs.com/yanyangtian/,作者:小洋

浅谈ASP.NET的内部机制(一)

     前言:当一个Http请求发送给一个aspx页面时,服务器进行了哪些操作?又如何来解析这个请求?ASP.NET在接收请求后是怎么运行的,如怎么编译以及怎么样用托管的代码来运行的?.....理解这些问题,使我们可以更加好的开发ASP.NET。
 
      1.当我们在浏览器中请求一个ASP.NET网站的某个页面的时候,如,我们在浏览器中输入"http://localhost/Demo.aspx",这个请求就被发送到了服务器(当然了,这个网站是部署在IIS中的)。当请求到达了服务器之后,那么IIS就开始进行一系列的操作。注意,不是每个请求都一定会由ASP.NET来运行处理的,大家稍后就会明白为什么。

      2.在IIS中有一个组件:http.sys,其实这个组件的作用很简单,就是验证请求的url,如之前的"http://localhost/Demo.aspx".如果请求的URL不符合http.sys的要求,那么这个请求就不会被传递给ASP.NET的处理程序,这样就在IIS这道门槛这些阻止了不合法的url请求,这样ASP.NET就不用处理这个不合法的请求,就减轻了服务器的压力。


      下面,我们就来看看这个http.sys到底是怎么样处理请求的url的,当大家明白这个问题后,就可以帮助我们解决很多的以前遇到的问题。
      首先请大家看看下面的图:

     
      

     当发送一个请求来请求页面的时候,http.sys就会检查这个请求的url和headers的总的大小:包含检查url中有关查询字符串的大小,如demo.aspx?username=demo,也会检查cookie的大小。把这些所有的加起来,看看它们是否超过了16KB,如果超过了,请求就失败了。所以请求根本就没有传递给ASP.NET。

      而且在http.sys检查url的时候也有很多的要求的。如我们之前的那个url:
      http://localhost/Demo.aspx


      这个url是由localhost,Demo.aspx,这些路径的片段组成的,每一个由"/"分割的字符串都是一个路径片段,本例中就有两个路径片段。在默认情况下,http.sys要求一个url的路径片段不超过255个,并且每个路径片段的大小也不要超过260个字母。但是注意,如果在Demo.aspx后面有查询字符串,"Demo.aspx?page=1",那么这个片段就可以超过260个字母的限制,即"Demo.aspx?page=1"可以更大。但是不管怎么样,这些url的大小,如之前所说的,不能超过16KB。如果没有通过http.sys的要求,IIS就发送一个404的错误。

      之前也说了的,那是默认的这只,其实这些设置我们是可以在注册表中改的。但是默认设置已经很不错了,所以一般没有必要改。

      3.当请求的url通过了http.sys的检查后,请求就会传递给aspnet_filter.dll,下面简称filter。
      其实这个filter做两件事:将url中的无cookie的票据转换为Http Headers;保护ASP.NET的相应的目录。

      首先来看看第一个作用:检查url中的无cookie信息,并且转换为Http Headers.


      大家应该明白ASP.NET2.0中的新特性-支持无cookie,即cookieless。因为我们在进行验证的时候一般是基于Forms验证,而这种验证方式是把信息保存在cookie中的,但是有的用户的浏览器是禁用了cookie的,所以为了使得我们可以继续用这个验证方式,就把验证信息保存为无cookie,大家可以去查看有关这方面的资料。来看看下面的一个url:
      http://localhost/demo/(S(tuucni55xfzj2xqx1mnqdg55))/Default.aspx
 我们其实把有关的信息存储在了url中,如上面的"S"就标识在后面括号"()"的信息就是无cookie的信息(tuucni55xfzj2xqx1mnqdg55).
 来看看“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中删除这些标识。我们本来请求的是http://localhost/demo/Default.aspx页面,但是如果filter不删除标识,那么我们请求的http://localhost/demo/(S(tuucni55xfzj2xqx1mnqdg55))/Default.aspx是不存在的,就会返回一个404错误(找不到请求的文件)。

      现在我们来看看filter的第二个作用的:保护ASP.NET的相应的目录。
      在我们开发的ASP.MET网站中,有很多的文件目录是不允许访问的,如我们存放数据的App_Data,App_Code等。所以filter就会检查请求的url中是否包含这样的字符,如http://localhost/demo/App_Code/....一旦发现有这样的字符串出现,甚至是以"App_"开发的任何字符串,如“App_MyFolder",这个请求就会被拒绝了。但是,假如你的项目中已经有一个这样的以"App_"命名的目录,如果你非要可以访问这样的目录,可以在注册表中修改设置HKEY_LOCAL_MACHINE\Software\Microsoft\ASP.NET。

 今天就写到这些,下篇接着讲述。