記錄asp.net在IE10下事件丟失排錯經過


最近項目中運用了地區三級聯動,用的是最普通的DropDownList回發來實現的,如下圖
一直用着都挺好的,可最近客戶最近新換了台服務器,我把網站遷移過去就有了問題,三級聯動失效了。
首先申明一點,這個三級聯動雖然是用服務器控件做的,但代碼是沒有錯的,我一點可以確認,不是網上經常看到的那些服務器控件屬性設置不對或方法使用不正確。
 
網站運行環境
新服務器:Windows Server2008 64位系統,IIS7,應用程序.net Framework 版本4.0、托管管道為集成模式、32位兼容模式。
原服務器:Windows Server2008 32位系統,IIS7,應用程序.net Framework 版本4.0、托管管道為集成模式。
本地開發:Windows 7 32位系統,IIS express 8,VS2012
 
測試環境:我自己機器上 IE10,Firefox21,Chome27,同事機器上IE6、7、8、9外加360,遨游、QQ之類的瀏覽器。
 
測試結果: 只有在新服務器和IE10組合時開會出現錯誤(就是DropDownList控件的OnSelectedIndexChanged事件失效、現象就是下拉框更改選擇后頁面不回發了)。
附:對新服務器中網站的抓包如下
注意:在IE10中,各種瀏覽器模式和文檔模式都一一試過,結果都是一樣。
從源碼可以看出,服務器返回給IE10的Html代碼中沒有onchange事件。
 
看到這里,不知道各位會認為錯誤出現在什么地方?
我的第一反應是錯誤出在服務器方,應該不是瀏覽器的問題,因為我們都知道,瀏覽器只是執行Html代碼,而Html代碼都是由服務器端動態返回的,很明顯服務器返回給IE10的Html代碼中丟失了onchange事件。再對比網站的服務器環境我把重心放到了64位系統上,因為新、舊服務器也就這點不同,結果掉坑里去了,把網站重新設置為64位環境編譯了一遍,編譯過程還挺曲折的,引用組件System.Data.SQLite.dll沒法在64位下運行,費了老大勁,花了大把時間給搞定,結果錯誤依舊。
 
到這里我又不得不懷疑是瀏覽器問題了,但是同事都沒有用IE10的,到目前為止也就我機器上測試到這個錯誤。想起老板新買的筆記本是Win8的所以就把鏈接發給他,讓他看看IE11下是不是有問題。結果老板一看我發的消息裁圖,北京市都跑四川了,以為數據庫出錯了,直接叫經理來解決問題。
經理過來一不看代碼,二不看服務器,直接認定我瀏覽器設置有問題,一番設置后,居然“好了”,其實就是把當前網站加入到IE的兼容性列表里(具體做法就是在IE菜單欄工具中將當前網站添加兼容性視圖)。
 
我一直以為F12中瀏覽器模式設置為“IE10兼容性視圖”和IE菜單欄工具中的添加兼容性視圖是一樣的,沒想到還有有些區別。
讀了后面這段,就會明白其實這個差別只是時間差,在工具欄中添加的兼容性視圖在請求時就是以兼容性視圖請求的。而F12中的兼容性視圖接收到的Html代碼是以IE正常模式講求的,只以兼容性視圖解析而已。
 
我們開發時遇到問題一般有兩種解決方式,一種像我們經理這樣,還有一種就是從根本上解決。我一般不贊成這種表面解決問題的方式,所以我就繼續找解決方案,既然問題出現在IE中,我試着用IE10之類的關鍵字搜索,最后用“asp.net IE10”Google時了一篇英文文章大概是這個意思,接着搜索才找到兩篇中文的。原文鏈接我也找不到了,大概意思就是,asp.net4.0出生得比IE10早,所以asp.net4.0以前版本不認識IE10 的 User-Agent 標頭,導致的后果就是ASP.NET 特定功能失效,例如:頁面報錯__doPostBack找不到,不支援 Cookies 功能等等。這屬於.net的Bug,微軟也發布了補丁。我沒找到文章中的補丁(不知道是后續補丁覆蓋了還是不同系統補丁編號不同),但我更新新服務器中的所有補丁后,錯誤沒有了。
 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM