国语自产精品视频在线看:您身边最放心的安全下载站! 最新软件|热门排行|软件分类|软件专题|厂商大全

国语自产精品视频在线看

技术教程
您的位置:首页网络编程.Net编程 → IIS处理Asp.net请求和 Asp.net页面生命周期

IIS处理Asp.net请求和 Asp.net页面生命周期

我要评论 2011/04/01 23:25:32 来源:国语自产精品视频在线看 编辑:downcc.com [ ] 评论:0 点击:197次

当一个【yī gè】🍴客户端【kè hù duān】页面【yè miàn】🍯访问IIS试图获取一些🕎信息的【de】😞时候,发生【shēng】了【le】🕜什么事情【qíng】🧞?一个请【yī gè qǐng】🔫求【qiú】在【zài】通💤过【guò】🥊了【le】🕜HTTP管道后【hòu】又发生【yòu fā shēng】了【le】🕜什么?本文主【běn wén zhǔ】要是【shì】💋描述这两个【liǎng gè】🤲过【guò】🥊程,即IIS处理asp.net请求【qǐng qiú】和【hé】🕑asp.net的【de】😞页面生【yè miàn shēng】🥗命周期【mìng zhōu qī】🔸。欢迎大家积极😸拍砖,共同【gòng tóng】学🗒习,共同【gòng tóng】😶进步。

首先我🎦们【men】🤷要弄清楚两个【liǎng gè】🤲非常重【fēi cháng chóng】要的【de】概念【niàn】🎍:

1, worker process(w3wp.exe). worker process管理所【guǎn lǐ suǒ】有🛍的【de】😞来自客户端【kè hù duān】的【de】请🏟求【qiú】并给🚇出【chū】响应。它是【tā shì】💋IIS下asp.net应用【yòng】程序的【de】😞核心。

2, application pool. 它是【tā shì】💋worker process的容器【de róng qì】⛪,IIS5及之前📻的【de】😞IIS版本均没有application pool的【de】概念【niàn】🎍。每一个【měi yī gè】🤲application pool对应着🐃一个【yī gè】🤲worker process,在【zài】🚽IIS Metabase中【zhōng】🥑维护着🤦Application Pool和【hé】worker process的【de】😞Mapping。这就避免了【le】🕜IIS5中【zhōng】🥑出现的【chū xiàn de】😞worker process(IIS5中【zhōng】是【shì】🙏aspnet_wp.exe,同😶一时间【yī shí jiān】只能运【zhī néng yùn】行一💌个【gè】🤲该进程)崩溃,application全崩溃🚫的【de】😞局面【jú miàn】🍯。

客户端【kè hù duān】向IIS发出【chū】一🧘个【gè】🤲资源请【zī yuán qǐng】求【qiú】👋后发生【hòu fā shēng】了【le】🕜如下事情【qíng】🧞:

1, server接受该【jiē shòu gāi】🍐请求【qǐng qiú】👋

IIS6通过内【tōng guò nèi】✡核模式(Kernel mode)中的【zhōng de】🈯HTTP.SYS来分发各个【gè gè】🤲Request到【dào】👼application pool。 这并不是【shì】💋随机的【de】过【guò】程👂,在【zài】🚽application pool创建【chuàng jiàn】🍇的【de】😞时候就🕢已经注册到【dào】👼了【le】🕜HTTP.SYS,所以当请求【qǐng qiú】👋来到时【lái dào shí】🏍HTTP.SYS会直接【jiē】🚥发送到【fā sòng dào】👼相应的【xiàng yīng de】🌲application pool。 接【jiē】🚥下来在【zài】🚽IIS的【de】😞用【yòng】户模式(User mode)中【zhōng】🥑,Web Admin Services (WAS) 做了【le】从🍔HTTP.SYS中得到【zhōng dé dào】🍚Request并分发🚐到【dào】👼application pool的工作【de gōng zuò】👸。application pool直接【jiē】🚥把request传递给worker process。

2, 请求【qǐng qiú】传🚀递到【dào】🏾worker process后【hòu】,worker process初始化【chū shǐ huà】🛸加载【jiā zǎi】🎄ASP.NET ISAPI(Internet Server Application Program Interface),ASP.NET ISAPI进而加载【jiā zǎi】🎄CLR创建托【chuàng jiàn tuō】🥊管环境🙃。

(注:ISAPI只是【shì】一➰个【gè】🤲接【jiē】🚥口,起到【dào】一🐿个【gè】🤲代理的【dài lǐ de】作用【yòng】😅,主要能力就是【jiù shì】💋根据【gēn jù】🗝Request URL的【de】😞后【hòu】缀来寻找🏾该后【hòu】缀的【de】😞处理程序)

ASP.NET ISAPI定义在【zài】🚽aspnet_isapi.dll中【zhōng】🥑,它【tā】本身运行在【zài】🚽一个【yī gè】🤲非托管【fēi tuō guǎn】的【de】🐏环境中【zhōng】🍚。ASP.NET ISAPI开始一⚪个【gè】🤲HttpRuntime, HttpRuntime调用【yòng】🦈ProcessRequest方法来😭开始处🦂理请求【lǐ qǐng qiú】👋。ProcessRequest根据【gēn jù】🗝ISAPI传进来【chuán jìn lái】的【de】😞iWRType 来创建【chuàng jiàn】🍇不同😶的【de】😞HttpWorkerRequest,从而屏💚蔽了【bì le】🕜不同😶IIS的【de】😞差异【chà yì】。接【jiē】🚥下来ProcessRequest方法创建【chuàng jiàn】了【le】🍏HttpContext,我们【men】使😓用【yòng】HTTPContext.Current来访问它【tā】。在【zài】🚽HttpRuntime使用【yòng】🔆HttpApplicationFactory创建【chuàng jiàn】了【le】🍏HttpApplication对象【duì xiàng】🚮(IHttpHandler)以后【hòu】,所有的【suǒ yǒu de】💱请求【qǐng qiú】👋都会在【zài】🚽通过【guò】🥊httpmodule后【hòu】找到【dào】👼相应的【xiàng yīng de】🌲Httphandler进行处【jìn háng chù】理。在【zài】🚽HttpApplicationFactory创建【chuàng jiàn】🍇HttpApplication之前📻,会查找👁config(web.config和【hé】Machine.config)文件中【wén jiàn zhōng】🚡注册的【de】😞所有的【suǒ yǒu de】💱HttpModule,并根据【bìng gēn jù】🗝配置信【pèi zhì xìn】息加载【jiā zǎi】🖋相应的【xiàng yīng de】🌲Assembly,通过【guò】🥊Reflection创建【chuàng jiàn】🍇对应的【duì yīng de】🌥HttpModule,并将这【bìng jiāng zhè】🚗些🕎Module加到【jiā dào】👼HttpApplication 的【de】😞_moduleCollection Filed中【zhōng】🥑。我们【men】对🛏一个【yī gè】🤲Application的【de】😞请求【qǐng qiú】👋最终会【zuì zhōng huì】🏋落到【dào】👼一个【yī gè】🤲HttpApplication对象【duì xiàng】🚮上。当一个【yī gè】🍴请求到【qǐng qiú dào】💦来时⛵,ASP.NET会在【zài】🚽Httplication Pool中【zhōng】🥑查找未被使用【yòng】🔆的【de】😞HttpApplication对象【duì xiàng】🚮。

3, 请求【qǐng qiú】👋通过【guò】🥊HTTP管道后【hòu】,每个请【měi gè qǐng】🎣求【qiú】👋都发向【dōu fā xiàng】相关的【de】😞各自的【de】😞httphandler,IIS请求【qǐng qiú】👋处理过【guò】🥊程结束🚥。

HttpHandler是【shì】💋HTTP管道的【guǎn dào de】😞终点【zhōng diǎn】,它为每【tā wéi měi】个【gè】🤲request生成输【shēng chéng shū】🗜出【chū】。System.Web.UI.Page就是【jiù shì】💋这样一【zhè yàng yī】个【gè】🤲典型的【diǎn xíng de】😞Httphandler,当我们【men】🤷请求【qǐng qiú】一📋个【gè】🤲aspx页面【yè miàn】🍯,这个【zhè gè】🤲HttpHandler就生【shēng】成html发送回【huí】🅰客户端【kè hù duān】。看Page类的【de】😞签名【qiān míng】:

public class Page : TemplateControl, IHttpHandler

{

}

可以看到【dào】👼,Page类就是【jiù shì】💋一个【yī gè】🤲HttpHandler。

综上整【zōng shàng zhěng】个【gè】🤲过【guò】🥊程就是【jiù shì】💋:当客户🚤端向服务器【fú wù qì】🌇发送资源⚡请求【qǐng qiú】👋时,请求【qǐng qiú】首🛍先到【dào】👼达IIS的【de】😞HTTP.SYS。然后【rán hòu】🎊HTTP.SYS发送请【fā sòng qǐng】👅求【qiú】👋道对应的【duì yīng de】🌥Application Pool。 然后【rán hòu】🎊Application Pool发送请【fā sòng qǐng】👅求【qiú】到【dào】💦Worker Process(W3WP.exe)中【zhōng】加载【jiā zǎi】🐺ISAPI Extension,ISAPI创建【chuàng jiàn】🍇一个【yī gè】🤲HttpRuntime对象【duì xiàng】🚮来通过【guò】🥊HttpModule和【hé】HttpHandler处理请求【lǐ qǐng qiú】👋。 然后【rán hòu】页🚓面【miàn】🍯生【shēng】命周期【mìng zhōu qī】就🏺开始了【le】🧛。

4, 页面生【yè miàn shēng】🥗命周期【mìng zhōu qī】🔸开始🖇

页面生【yè miàn shēng】🥗命周期【mìng zhōu qī】🔸的【de】😞主要阶【zhǔ yào jiē】段包🚈括【kuò】:

页面【yè miàn】🍯初始化【chū shǐ huà】🛸(Init): 服务器【fú wù qì】🌇创建【chuàng jiàn】🍇服务器【fú wù qì】🌇控件的【kòng jiàn de】😞实例【shí lì】🍍

加载【jiā zǎi】🎄(load): 控件【kòng jiàn】实🏌例【lì】🍍被加载【bèi jiā zǎi】🎄到【dào】👼它【tā】定义的【dìng yì de】🐊页面【yè miàn】🍯对象【duì xiàng】🚮中【zhōng】🥑

预输出【chū】:(PreRender) 对控件【duì kòng jiàn】➗的【de】更改👡被更新【bèi gèng xīn】⏯,准备输【zhǔn bèi shū】出【chū】。

保存🐎(SaveViewState): 控件的【kòng jiàn de】😞状态信【zhuàng tài xìn】息被保存🐎。

输出页【shū chū yè】面【miàn】🍯(Render):服务器【fú wù qì】🌇为控件【kòng jiàn】创建【chuàng jiàn】🍇html标记。

处理(Dispose): 主要做【zhǔ yào zuò】的工作【de gōng zuò】👸就是【jiù shì】💋dispose, 关闭数🥓据库连【jù kù lián】🦁接【jiē】🚥,文件【jiàn】资源的【de】😞释放等【děng】🐾。

卸载【zǎi】(Unload):销毁服务器【fú wù qì】🌇控件的【kòng jiàn de】😞实例【shí lì】🍍

页面生【yè miàn shēng】🥗命周期【mìng zhōu qī】🔸的【de】😞主要事件【shì jiàn】:

PreInit:

1.检查🛐IsPostBack 属性【shǔ xìng】🏝

2.动态设🍖置【zhì】Master Page

3.动态设🍖置【zhì】Theme

4.设置【zhì】控件的【kòng jiàn de】😞默认值【zhí】(UniqueId等【děng】)

5.重新创建【chuàng jiàn】🍇动态控【dòng tài kòng】件【jiàn】(初始化【chū shǐ huà】🛸控件【kòng jiàn】),初始化【chū shǐ huà】🛸控件的【kòng jiàn de】😞值【zhí】

Init: 这个【zhè gè】🤲事件发【shì jiàn fā】生【shēng】在【zài】🚽所有的【suǒ yǒu de】💱控件【kòng jiàn】被初始化【chū shǐ huà】🛸,所有的【suǒ yǒu de】💱皮肤设😷置被应【zhì bèi yīng】🥈用【yòng】以后【hòu】。它【tā】用【yòng】来读取或🎂者初始【zhě chū shǐ】化🛸控件【kòng jiàn】属性【shǔ xìng】🏝。它【tā】能够用【yòng】来注册一些🕎aspx页面中【yè miàn zhōng】🎻没有指😋出的【chū de】控件【kòng jiàn】🤺的【de】😞事件【shì jiàn】。

InitComplete: Use this event for processing tasks that require all initialization to be complete.

PreLoad: 加载【jiā zǎi】🎄页面【yè miàn】🍯的【de】😞ViewState和【hé】所有的【suǒ yǒu de】💱控件【kòng jiàn】,然后处【rán hòu chù】🧓理所有🛍的【de】😞包含在【zài】🚽Request实例【shí lì】🍍中的【zhōng de】🈯postback数据🐇。

Load: 这个【zhè gè】🤲事件可【shì jiàn kě】能⛰是【shì】💋大家最熟悉的【de】😞了【le】🕜。需要注😡意的【yì de】😞是【shì】💋,Page对象【duì xiàng】🚮会递归的【de】🥀调用【yòng】🦈子控件【zǐ kòng jiàn】的【de】😞onload事件【shì jiàn】直到【dào】👼页面【yè miàn】🍯和【hé】所有的【suǒ yǒu de】💱子控件【zǐ kòng jiàn】被加载【bèi jiā zǎi】🎄完成【wán chéng】。这个【zhè gè】🤲事件主【shì jiàn zhǔ】要🦇用【yòng】来设置【zhì】控件【kòng jiàn】属性【shǔ xìng】🏝的【de】😞值【zhí】,建立数据🐇库连接【kù lián jiē】🚥(通常不这么做👔)。

Control events: 这个【zhè gè】🤲就不多说🧖了【le】🕜,主要是【shì】💋处理控件的【kòng jiàn de】事🚤件【jiàn】,例【lì】🍍如click。这也就让我们【ràng wǒ men】🤷明白了【le】🕜每次我📂们【men】🤷click一个【yī gè】🤲Button的【de】😞时候,实际上是要先【shì yào xiān】💥去执行load事件【shì jiàn】然♊后才执【hòu cái zhí】🐭行click事件【shì jiàn】的【de】🌟,一般我🌉们【men】🤷用【yòng】!IsPostBack来判断【lái pàn duàn】一下从而避免执行不【zhí háng bú】🔁必要的【de】😞加载【jiā zǎi】逻⛴辑【jí】。

LoadComplete: 页面【yè miàn】🍯所有的【suǒ yǒu de】💱控件【kòng jiàn】都被加载【bèi jiā zǎi】以✔后执行【hòu zhí háng】,暂时没🎐有想到【dào】😽用【yòng】来干什么。。。

PreRender: 在【zài】🚽HTML被生【shēng】成之前这【zhī qián zhè】⛷是【shì】💋最后一【zuì hòu yī】个【gè】事🎷件【jiàn】。每一个【měi yī gè】🤲页面中【yè miàn zhōng】🎻的【de】控件【kòng jiàn】🤺都有PreRender的【de】过【guò】程👂。在【zài】🚽这里对将要输出的【chū de】😞HTML结果进【jié guǒ jìn】行最后【háng zuì hòu】一次修改。

SaveStateComplete: 在【zài】这个【zhè gè】⛴时间发【shí jiān fā】生之前【shēng zhī qián】🐟,已经保存🐎了【le】🕜所有控件【kòng jiàn】和【hé】页面【yè miàn】🍯的【de】😞,任何对page或者控【huò zhě kòng】件的【jiàn de】😞改动都不会产生【shēng】🚔左右。暂时没🎐想到【dào】👼用【yòng】来干啥【shá】🚎。

Render: 它【tā】不是【shì】🛡一个事【yī gè shì】🎷件【jiàn】而是【shì】💋一个【yī gè】🤲方法。工作✂就是【jiù shì】💋把HTML写回【huí】客户端【kè hù duān】浏览器【lǎn qì】🔚。

UnLoad: 页面中【yè miàn zhōng】🎻的每一【de měi yī】🏆个【gè】控件【kòng jiàn】😿都会发【dōu huì fā】生【shēng】这件【jiàn】🕥事。在【zài】控件【kòng jiàn】👁中【zhōng】🥑,使用【yòng】🔆这个【zhè gè】🤲事件【shì jiàn】来做清😕理工作✂,例【lì】🍍如关闭数🥓据库连【jù kù lián】🦁接【jiē】🚥等【děng】。对与页【duì yǔ yè】面【miàn】🍯本身也是【shì】💋做清理工作✂,例【lì】🍍如关闭打开🍨的【de】😞文件【jiàn】和【hé】数据🐇库连接【kù lián jiē】🚥,或者结【huò zhě jié】🤴束日志或者其【huò zhě qí】它【tā】指定的工作【de gōng zuò】👸。

需要说【xū yào shuō】🦏明的【de】😞是【shì】💋,每次Request都会创建【chuàng jiàn】🍇一个【yī gè】🤲全新的【de】😞Page类的【de】😞实例【shí lì】🍍,所以在【suǒ yǐ zài】🚽页面中【yè miàn zhōng】🎻的【de】自己👿定义的【dìng yì de】🐊字段是【shì】🤝不能在【zài】🚽两次request中传递【zhōng chuán dì】🐸值【zhí】的【de】🎞,需要使【xū yào shǐ】用【yòng】🔆viewstate来存🐎储。

5, HttpHandler根据【gēn jù】🗝页面生【yè miàn shēng】🥗命周期【mìng zhōu qī】🔸中【zhōng】🥑事件【shì jiàn】的【de】🌟处理把【chù lǐ bǎ】🐗结果发回【huí】🔦IIS,IIS再把结【zài bǎ jié】果发回【huí】🔦客户端【kè hù duān】浏览器【lǎn qì】🔚。

值得注【zhí dé zhù】意的【yì de】😞是【shì】💋,在【zài】这个【zhè gè】⛴过【guò】🥊程中【chéng zhōng】🥑请求【qǐng qiú】👋会再次通过【guò】🥊HttpModule(注册一个【yī gè】🤲EndRequest事件【shì jiàn】)。

至此【zhì cǐ】,整个【gè】🤲Request结束🚥。

关键词:IIS,Asp.net

阅读本文后您有什么感想? 已有 人给出评价!

  • 0 欢迎喜欢
  • 0 白痴
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙视