建站學(xué)院(LieHuo.Net)轉(zhuǎn)載 今天快下班的時候,打開自己做的頁面,在頁面上(用的是Firefox)隨便點(diǎn)點(diǎn),檢查看看有沒有什么地方要修改的。但就是這簡單的動作,切發(fā)現(xiàn)了一個讓我郁悶的、同時也花了我將近兩個小時才解決的問題----空間首頁發(fā)生“二次回調(diào)”(感謝網(wǎng)友的指正,本文中所指的二次回調(diào)指的是首頁被請求了兩次)了!
先說說造成二次請求的元兇:Image控件的ImageUrl屬性!
通常,我們都用Image控件來顯示圖片,圖片的路徑就是通過ImageUrl來指定的,這都沒錯,但是,如果用了Image控件,又不給ImageUrl賦值,二次請求的問題就來了。
Image控件被服務(wù)器解析后,ImageUrl會被轉(zhuǎn)換成img的src屬性用來標(biāo)識圖片的路徑,瀏覽器會根據(jù)src屬性來請求圖片。當(dāng)src屬性為空時,瀏覽器會請求當(dāng)前頁面,這就造成了二次回調(diào)。這個回調(diào)還是一個標(biāo)準(zhǔn)的PostBack,雖然這個PostBack不影響現(xiàn)有頁面,但是這個PostBack會向服務(wù)器再請求一次頁面,必然會給服務(wù)器帶來額外的壓力。
解決方法:如果使用了Image控件,請務(wù)必給ImageUrl賦值!
=================================================================
感謝木野狐(Neil Chen)對這個問題做出的更加地道的解釋:
其中對于木兄說的“并不會帶來什么嚴(yán)重后果”,我還是有點(diǎn)疑問:這個原本對圖片的請求被轉(zhuǎn)移到請求頁面上了,如果被請求頁面的Page_Load事件中有影響性能或功能的代碼,這難道不會給網(wǎng)站的性能和功能帶來影響?
問題的根本原因在于,HTML 中 <img /> 如果不設(shè)置 src 屬性沒有關(guān)系,但是如果設(shè)置一個空字符串作為該屬性的值:
<img src="" />
這時就相當(dāng)于有了一個默認(rèn)值為 "./", 也就是對當(dāng)前目錄下默認(rèn)文檔的請求。
所以,當(dāng)圖片加載時,會根據(jù) src 指定的值去讀取這個 url 的輸出,這里只是發(fā)出了一個 GET 請求,而不是 POST, 所以沒有 Postback 一說。
而你恰好測試的是網(wǎng)站首頁,正好是該目錄的默認(rèn)文檔,所以就被 "./" 這個路徑給引用到了。
你可以用一個簡單的 HTML page 來測試,而不用 aspx,就會很明了了。
最后的結(jié)論是,這個問題不能怨 asp.net,也不能怨 ImageUrl 控件,充其量只能怪它多輸出了一個無用的 url="" 屬性(在沒有指定 ImageUrl 的情況下),其最壞結(jié)果也只是多發(fā)出了一次對該目錄下默認(rèn)文檔的請求而已,并不會帶來什么嚴(yán)重后果。
=================================================================
在下圖,通過分析Request Header中的Accept,不難發(fā)現(xiàn)瀏覽器第一次請求服務(wù)器時是正常的請求(text/html,application/xhtml+xml),第二次則是在請求圖片(image/png,image/*):
下面簡單的說說揪出元兇的過程:
1. 排除瀏覽器導(dǎo)致二次請求的可能性:由于是在Firefox中發(fā)現(xiàn)問題的,于是用IE打開頁面,用HttpAnalyzer監(jiān)聽發(fā)現(xiàn)二次回調(diào)還是存在
2. 排除MasterPage導(dǎo)致二次請求的可能性:由于頁面用到了MasterPage,打開其他也使用同意個MasterPage的頁面,仔細(xì)檢查發(fā)現(xiàn)除首頁外,其他頁面不存在二次請求的問題,排除MasterPage出錯的可能性
3. 排除Javascript導(dǎo)致二次請求的可能性:在Firebug中,把Javascript禁用后,刷新頁面,發(fā)現(xiàn)二次請求還是存在
4. 排除后臺代碼導(dǎo)致二次請求的可能性:把后臺代碼全部注釋,刷新頁面,發(fā)現(xiàn)二次請求還是存在
5. 經(jīng)過上面的排除法,現(xiàn)在只剩下前臺頁面的造成二次請求的可能性了,雖然頁面代碼不少,但為了解決問題,還是硬著頭皮上:經(jīng)過漫長的注釋前臺代碼,刷新頁面,功夫不負(fù)有心人,終于讓我發(fā)現(xiàn)原來是asp:Image造成了二次請求!
點(diǎn)擊下載代碼