2013年7月04日_回顾总结
1、瀏覽器與服務(wù)器的交互是通過Socket
2、瀏覽器與服務(wù)器交互的語(yǔ)法是:Http協(xié)議
3、瀏覽器于服務(wù)器交互的目的:獲取服務(wù)器資源(html、圖片、js、css)
4、服務(wù)器的功能:滿足瀏覽器的需求,一旦是動(dòng)態(tài)請(qǐng)求時(shí),服務(wù)器創(chuàng)建頁(yè)面類對(duì)象,并執(zhí)行里面的方法,
最后生成html頁(yè)面,返回。
5、WebForm開發(fā)只不過是進(jìn)一步對(duì)ashx(一般處理程序的繼承)
6、頁(yè)面對(duì)象包含一個(gè)要輸出到瀏覽器的《textWrite中》數(shù)據(jù)緩存區(qū)。在處理程序處理的數(shù)據(jù)放到了緩存中,在緩存區(qū)中處理http報(bào)文等,然后再一次性的輸出《包括生成的html代碼》。
7、開發(fā)中的js編程的效率的提高:盡量少的去遍歷節(jié)點(diǎn)樹。可以用臨時(shí)變量來(lái)保存對(duì)象的引用。
Request中其他成員:
Request.UrlReferrer 上一次的地址----->防盜鏈
Request.UserHostAddress-------->獲得訪問者的IP地址
Request.Cookies--------->context.Request.Cookies["mysessionid"] ? ------------>Response.Cookies<寫回>
Request.MapPath(virtulPath)將虛擬路徑轉(zhuǎn)換為磁盤上的物理路徑------------>挺重要
?響應(yīng)的緩沖輸出:為了提高服務(wù)器的性能,ASP.Net向?yàn)g覽器Write的時(shí)候默認(rèn)并不會(huì)每Write一次都會(huì)立即輸出到瀏覽器,而是會(huì)緩存數(shù)據(jù),到合適的時(shí)機(jī)或者響應(yīng)結(jié)束才會(huì)將緩沖區(qū)中的數(shù)據(jù)一起發(fā)送到瀏覽器。 Response.Flush()是直接輸出 ?Response對(duì)象的主要成員: –1、Response.Buffer、Response.BufferOutput:經(jīng)過Reflector反編譯,發(fā)現(xiàn)兩個(gè)屬性是一樣的,Buffer內(nèi)部就是調(diào)用的BufferOutput。這個(gè)屬性用來(lái)控制是否采用響應(yīng)緩存,默認(rèn)是true。 –2、Response.Flush()將緩沖區(qū)中的數(shù)據(jù)發(fā)送給瀏覽器。這在需要將Write出來(lái)的內(nèi)容立即輸出到瀏覽器的場(chǎng)合非常適用。案例:大批量數(shù)據(jù)的導(dǎo)入,顯示正在導(dǎo)入第*條數(shù)據(jù),用Thread.Sleep模擬耗時(shí)。 –3、Response.Clear()清空緩存區(qū)中的數(shù)據(jù),這樣在緩存區(qū)中的沒有發(fā)送到瀏覽器端的數(shù)據(jù)被清空,不會(huì)被發(fā)送到瀏覽器。 –4、Response.ContentEncoding輸出流的編碼。 –5、Response.ContentType 輸出流的內(nèi)容類型,比如是html(text/html)還是普通文本(text/plain)還是JPEG圖片(image/JPEG)。6、Response.Cookies 返回給瀏覽器的Cookie的集合,可以通過它設(shè)置Cookie
7、Response.OutputStream 輸出流,在輸出圖片、Excel文件等非文本內(nèi)容的時(shí)候要使用它
8、Response.End()? 終止響應(yīng),將之前緩存中的數(shù)據(jù)發(fā)給瀏覽器,End()之后的代碼不會(huì)被繼續(xù)執(zhí)行。在終止一些非法請(qǐng)求的時(shí)候,比如盜鏈等可以用End()立即終止請(qǐng)求。
9、Response.Redirect(url) 重定向?yàn)g覽器到新的網(wǎng)址。即可以重定向到站外網(wǎng)址也可以重定向到站內(nèi)網(wǎng)址。Response.Redirect("http://www.rupeng.com")、Response.Redirect("a.htm")。Redirect是向?yàn)g覽器發(fā)回302重定向,是通知瀏覽器“請(qǐng)重新訪問url這個(gè)網(wǎng)址”,這個(gè)過程經(jīng)歷了服務(wù)器通知瀏覽器“請(qǐng)重新訪問url這個(gè)網(wǎng)址”和瀏覽器接到命令訪問新網(wǎng)址的過程。使用HttpWatch查看整個(gè)響應(yīng)過程的Http報(bào)文。用Redirect因?yàn)槭菫g覽器自己去重新訪問新網(wǎng)址的,所以在地址欄中是可以看到網(wǎng)址的變化的。后面會(huì)用來(lái)防止刷新瀏覽器時(shí)提示“重試”。
10、Response.SetCookie(HttpCookie cookie),向輸出流中更新寫到瀏覽器中的Cookie,如果Cookie存在就更新不存在就增加。是對(duì)Response.Cookies的簡(jiǎn)化調(diào)用。
11、Response.Write()向?yàn)g覽器輸出內(nèi)容。
12、(*)Response.WriteFile(filename)向?yàn)g覽器輸出文件。比如Response.WriteFile("c:/boot.ini")
--------------在服務(wù)器端控件中,添加了事件要加AutoPostBack=“true” 屬性如textarea
?
-------------------------------------------------------------------------------運(yùn)行過程總結(jié)------------------------------------------------------------------
1、asp.net頁(yè)的生命周期——《引用其他人博客》
一.什么是Asp.Net頁(yè)面生命周期
當(dāng)我們?cè)跒g覽器地址欄中輸入網(wǎng)址,回車查看頁(yè)面時(shí),這時(shí)會(huì)向服務(wù)器端(IIS)發(fā)送一個(gè)request請(qǐng)求,服務(wù)器就會(huì)判斷發(fā)送過來(lái)的請(qǐng)求頁(yè)面,? 完全識(shí)別 HTTP 頁(yè)面處理程序類后,ASP.NET 運(yùn)行時(shí)將調(diào)用處理程序的 ProcessRequest 方法來(lái)處理請(qǐng)求,來(lái)創(chuàng)建頁(yè)面對(duì)象。通常情況下,無(wú)需更改此方法的實(shí)現(xiàn),因?yàn)樗怯?Page 類提供的。接下來(lái)被創(chuàng)建頁(yè)面對(duì)象的ProcessRequest方法使頁(yè)面經(jīng)歷了各個(gè)階段:初始化、加載視圖狀態(tài)信息和回發(fā)數(shù)據(jù)、加載頁(yè)面的用戶代碼以及執(zhí)行回發(fā)服務(wù)器端事件。之后,頁(yè)面進(jìn)入顯示模式:收集更新的視圖狀態(tài),生成 HTML 代碼并隨后將代碼發(fā)送到輸出控制臺(tái)。最后,卸載頁(yè)面,并認(rèn)為請(qǐng)求處理完畢。其中頁(yè)面對(duì)象ProcessRequest方法 完成的這一系列事件的處理過程就是Asp.Net頁(yè)面生命周期。
?
二.了解Asp.Net頁(yè)面生命周期的好處
了解個(gè)掌握ASP.NET頁(yè)面生命周期是非常必要的,這有助于我們更加靈活的控制頁(yè)面,以我們需要的方式編程開發(fā)。ASP.NET頁(yè)運(yùn)行時(shí),此頁(yè)會(huì)經(jīng)歷一個(gè)又一個(gè)的事件鏈,每個(gè)事件鏈中執(zhí)行不同的行為,這所有的行為共同組成我們所需要的頁(yè)面。了解了生命周期也更有助于我們對(duì)程序調(diào)試中發(fā)生問題的地方的定位。
三.詳解Asp.Net頁(yè)面生命周期
?
(一)先看看在開始一個(gè)頁(yè)面生命周期之前,請(qǐng)求的頁(yè)面經(jīng)歷了那些過程。如圖所示:
?
通信處理過程:
當(dāng)服務(wù)器運(yùn)行正常的情況下,客戶端(瀏覽器)
向服務(wù)器端發(fā)送請(qǐng)求時(shí),服務(wù)器端負(fù)責(zé)監(jiān)聽的套接字(socket),監(jiān)聽到有連接請(qǐng)求后,會(huì)為該客戶端建立一個(gè)用于通信的套接字與客戶端進(jìn)行通信。當(dāng)用戶在瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí),瀏覽器會(huì)按照雙方都約定好的網(wǎng)絡(luò)傳輸層http協(xié)議,將請(qǐng)求轉(zhuǎn)換成符合Http協(xié)議的請(qǐng)求報(bào)文。然后通過設(shè)備按照TCP協(xié)議發(fā)送到服務(wù)器。在服務(wù)器端接收到請(qǐng)求報(bào)文后。會(huì)按照Http協(xié)議對(duì)報(bào)文進(jìn)行解析。若請(qǐng)求的內(nèi)容為靜態(tài)的數(shù)據(jù),服務(wù)器端直接將被請(qǐng)求的數(shù)據(jù),按照Http協(xié)議生成響應(yīng)報(bào)文后返回給瀏覽器。瀏覽器然后解析收到的報(bào)文。將頁(yè)面顯示到瀏覽器窗口。(注:最開始僅是顯示一個(gè)html 框架。經(jīng)過多次請(qǐng)求。將CSS樣式,圖片………逐一的加載進(jìn)來(lái)形成一個(gè)完整的頁(yè)面。這個(gè)過程,有多次的交互通信。當(dāng)通信結(jié)束后會(huì)把用來(lái)通信的套接字銷毀,因?yàn)閔ttp協(xié)議是一種無(wú)狀態(tài)的通信。這樣減輕了服務(wù)器的壓力)
當(dāng)瀏覽器向客戶端發(fā)送的請(qǐng)求為動(dòng)態(tài)的。那么服務(wù)器(IIS)發(fā)現(xiàn)處理不了這種后綴名的文件時(shí),會(huì)通過映射表到。響應(yīng)實(shí)現(xiàn)了接口的可擴(kuò)展程序asp.net_isapi.dll,?然后asp.net_isapi.dll,又將請(qǐng)求轉(zhuǎn)交給網(wǎng)站程序處理.網(wǎng)站程序調(diào)用
httpRuntime類的processRequest方法來(lái)處理:
1.???????? 此類會(huì)分析接收到的請(qǐng)求報(bào)文.將請(qǐng)求報(bào)文封裝到名稱為httpWorkerRequest的類的屬性中(便于其它地方以用).
2.???????? 創(chuàng)建HttpContext對(duì)象.這個(gè)對(duì)象是當(dāng)前所請(qǐng)求報(bào)文的上下文環(huán)境.它包含了所有的請(qǐng)求數(shù)據(jù).其中有兩個(gè)最重要類的對(duì)象:http.Request和http.Response.? 在httpRequest對(duì)象中又包含了兩個(gè)屬性.Form(通過表單請(qǐng)求的數(shù)據(jù)參數(shù)).Querystring(通過URL傳遞的數(shù)據(jù)參數(shù)); 通過索引器,可以找到參數(shù)的值. 在httpResponse 對(duì)象中有一個(gè)TextWriter對(duì)象.在它里面保存的是被請(qǐng)求的頁(yè)面在執(zhí)行過程中要向?yàn)g覽器輸出的數(shù)據(jù).可以通過write 方法對(duì)其進(jìn)行輸出給瀏覽器。
3.???????? 通過HttpApplicationFactory類的的一個(gè)靜態(tài)方法。來(lái)為每個(gè)請(qǐng)求創(chuàng)建一個(gè)單獨(dú)的httpApplication對(duì)象。在創(chuàng)建之前HttpApplicationFactor會(huì)到HttpApplication池中查看,有沒有空閑的。若有直接用。沒有的時(shí)候才創(chuàng)建新的HttpApplication。
4.???????? 在httpApplication里運(yùn)行己轉(zhuǎn)換成接口IhttpHandler 的通過反射被請(qǐng)求頁(yè)面對(duì)象的ProcessRequest 方法.
方法執(zhí)行過程如下:先執(zhí)行httpApplication中的processRequest方法。在此方法中包含了要按照先后順序執(zhí)行的19個(gè)委托事件 當(dāng)在執(zhí)行到第8個(gè)事件的時(shí)候就開始創(chuàng)建被請(qǐng)求頁(yè)面對(duì)象,在執(zhí)行到第11和第12個(gè)事件之間時(shí)。就執(zhí)行被創(chuàng)建的請(qǐng)求頁(yè)面對(duì)象的ProcessRequest方法。
?
?
(二)開始頁(yè)面生命周期
1.頁(yè)面生命周期的主要階段包括: 階段 事件/方法???
頁(yè)面初始化?? ???????Page_Init??
加載View State?? ? ?LoadViewState???
回發(fā)數(shù)據(jù)處理 ?????LoadPostData???
頁(yè)面加載? ????????Page_Load???
回發(fā)通知???????? ?RaisePostDataChangedEvent??
回發(fā)事件處理 ????RaisePostBackEvent??
頁(yè)面預(yù)渲染 ??????Page_PreRender???
保存???????????? viewstate SaveViewState???
Page渲染?????? ??Page_Render???
Page 卸載 ??????Page_UnLoad??
2.頁(yè)面生命周期的主要事件:
PreInit:
1.檢查IsPostBack 屬性
2.動(dòng)態(tài)設(shè)置Master Page
3.動(dòng)態(tài)設(shè)置Theme
4.設(shè)置控件的默認(rèn)值(UniqueId等)
5.重新創(chuàng)建動(dòng)態(tài)控件(初始化控件),初始化控件的值
Init: 這個(gè)事件發(fā)生在所有的控件被初始化,所有的皮膚設(shè)置被應(yīng)用以后。它用來(lái)讀取或者初始化控件屬性。它能夠用來(lái)注冊(cè)一些aspx頁(yè)面中沒有指出的控件的事件。
InitComplete: Use this event for processing tasks that require all initialization to be complete.
PreLoad: 加載頁(yè)面的ViewState和所有的控件,然后處理所有的包含在Request實(shí)例中的postback數(shù)據(jù)。
Load: 這個(gè)事件可能是大家最熟悉的了。需要注意的是,Page對(duì)象會(huì)遞歸的調(diào)用子控件的onload事件直到頁(yè)面和所有的子控件被加載完成。這個(gè)事件主要用來(lái)設(shè)置控件屬性的值,建立數(shù)據(jù)庫(kù)連接(通常不這么做)。
Validation: 如果你的控件要求驗(yàn)證,驗(yàn)證會(huì)在這個(gè)階段發(fā)生,這個(gè)時(shí)候你可以檢查控件的IsValid屬性。跟這個(gè)階段關(guān)聯(lián)的事件是Validate,它有一個(gè)可以接受驗(yàn)證字符串群的重載方法(overload method),這個(gè)重載方法執(zhí)行特定控件群的驗(yàn)證。
Control events: 這個(gè)就不多說(shuō)了,主要是處理控件的事件,例如click。這也就讓我們明白了每次我們click一個(gè)Button的時(shí)候,實(shí)際上是要先去執(zhí)行l(wèi)oad事件然后才執(zhí)行click事件的,一般我們用!IsPostBack來(lái)判斷一下從而避免執(zhí)行不必要的加載邏輯。
LoadComplete: 頁(yè)面所有的控件都被加載以后執(zhí)行,暫時(shí)沒有想到用來(lái)干什么。。。
PreRender: 在HTML被生成之前這是最后一個(gè)事件。每一個(gè)頁(yè)面中的控件都有PreRender的過程。在這里對(duì)將要輸出的HTML結(jié)果進(jìn)行最后一次修改。
SaveStateComplete: 在這個(gè)時(shí)間發(fā)生之前,已經(jīng)保存了所有控件和頁(yè)面的,任何對(duì)page或者控件的改動(dòng)都不會(huì)產(chǎn)生左右。暫時(shí)沒想到用來(lái)干啥。
Render: 它不是一個(gè)事件而是一個(gè)方法。工作就是把HTML寫回客戶端瀏覽器。
UnLoad: 頁(yè)面中的每一個(gè)控件都會(huì)發(fā)生這件事。在控件中,使用這個(gè)事件來(lái)做清理工作,例如關(guān)閉數(shù)據(jù)庫(kù)連接等。對(duì)與頁(yè)面本身也是做清理工作,例如關(guān)閉打開的文件和數(shù)據(jù)庫(kù)連接,或者結(jié)束日志或者其它指定的工作。
需要說(shuō)明的是,每次Request都會(huì)創(chuàng)建一個(gè)全新的Page類的實(shí)例,所以在頁(yè)面中的自己定義的字段是不能在兩次request中傳遞值的,需要使用viewstate來(lái)存儲(chǔ)。
頁(yè)面處理的整體過程圖解
?
四.什么地方用到了Asp.Net?頁(yè)面生命周期
???對(duì)于這個(gè)問題,在面試中我遇到過,我覺得問這個(gè)問題有點(diǎn)不正常。我當(dāng)時(shí)回答的是。Viewstate 對(duì)值的記錄上用到了生命周期,總是覺對(duì)不太對(duì)。
生命周期理解了,并不代表我們會(huì)用它。只有理解了,我們才會(huì)在以后的工作中慢慢真正的懂它,用它。
總結(jié):計(jì)劃了好久,一直沒有寫,今天下定決心一定要寫了。終于完成了。我看有一位博友的用三張圖片詳解Asp.Net 全生命周期還不錯(cuò)。用圖結(jié)構(gòu)清晰,更便于理解。故貼到下面便于博友們和以后自己的查看。原文地址:http://www.cnblogs.com/zhaoyang/archive/2011/11/16/2251200.html
說(shuō)明:
1? 第一張圖片從全局說(shuō)明從客戶端發(fā)出一個(gè)Request請(qǐng)求,服務(wù)器windows內(nèi)核中的HTTP.SYS組件接收該請(qǐng)求開始到IIS處理完該請(qǐng)求并響應(yīng)到客戶端結(jié)束。
2? 第二張圖片為圖1中Http處理管線的詳細(xì)步驟
3? 第三張圖片為圖2Http處理管線中調(diào)用處理程序(HttpHandler,? 此處為Page對(duì)象)的詳細(xì)生命周期過程。
圖1:
?
圖2.
?
圖3.
?
轉(zhuǎn)載于:https://www.cnblogs.com/kongbin/p/3171468.html
總結(jié)
以上是生活随笔為你收集整理的2013年7月04日_回顾总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言逗号运算符和逗号表达式
- 下一篇: CTime,Systemtime的比较还