.net framework4.5.1以前的版本有一個很是愚蠢的設定, 它爲每一個瀏覽器設置了一個瀏覽器定義文件, 經過正則表達式來匹配瀏覽器的userAgent, 而後來定義一些功能集.
javascript
這種作法有一個顯而易見的問題, 瀏覽器是會常常升級的, 每次升級後, userAgent都會有變化, 這就致使.net framework的正則表達式跟新版本的瀏覽器匹配失敗, 因而新版本瀏覽器被認定爲"沒法識別的瀏覽器", 對這種"沒法識別的瀏覽器", .net framework的決定是: 大部分的功能不予支持, 其中javascript就是不被支持的功能之一. java
好笑的是,被這個愚蠢的設定傷害最深的卻正是微軟本身. 正則表達式
當.net 4.0發佈時, IE瀏覽器的最高版本是9.0, 因而.net 4.0的瀏覽器定義文件只能識別IE6-9, 後來IE10發佈了, 問題就來了, 當用IE10訪問.net 4.0的網站時, 最常常看到的錯誤提示就是"__doPostBack is not defined", 之因此會報__doPostBack未定義, 是由於這個函數原本應該由.net framework自動生成, 可是因爲IE10被標記爲不支持javascript, 因此服務器端發回的文件中就不包括任何的js代碼, 因而頁面上的函數嘗試調用__doPostBack時, 就會報錯. chrome
因此實際上,這個錯誤只是個表象,真正的緣由是腳本被服務器端禁用了.
瀏覽器
爲了解決這個問題,微軟發佈了一個hotfix: http://support.microsoft.com/kb/2600088 服務器
當在服務器上安裝了這個hotfix時, 就會在.net 4.0的瀏覽器定義文件中增長對ie10的支持. cookie
但是,故事並無到這裏結束. 隨後.net 4.5發佈, .net 4.5已經內置了對ie10的支持. 可是不久, 更高版本的IE11又發佈了. app
讓人不可理解的是, .net4.0 不支持IE10這件事, 微軟應該已經從中吸收教訓了, 可是結果倒是沒有. dom
上述補丁僅僅能讓服務器識別IE10, 卻仍然不能識別IE11, .net 4.5和.net 4.0出了同樣的情況, 不能識別最新版的IE: 當用IE11訪問.net 4.5的網站時, 一樣將遇到腳本被禁用的問題. ecmascript
此次微軟大約是有點很差意思再發補丁了, 因而直到我寫這篇文章時爲止,仍然沒有修補補丁, 官方的處理方式只有一種, 安裝.net 4.5.1, 但是若是服務器是.net 4.0的, 而且由於兼容問題, 暫時沒法升級到.net 4.5的, 就徹底沒有官方的處理辦法了.
.net 4.5.1終於從前兩次的事故中吸收了一點教訓, 它並無定義一個新的用於識別IE11的正則表達式, 而是加強了通用瀏覽器的功能支持, 因而這條規則能夠這樣描述: 凡是被識別爲"Mozilla"的瀏覽器, 加強其功能, 使它支持javascript, 以及其它幾項之前不支持的功能. 而IE11的userAgent就是以Mozilla打頭的, 因此將做爲Mozilla通用瀏覽器進行處理.
順帶着說一句: 如今的瀏覽器基本上都是以Mozilla打頭的, 如firefox, chrome, ie10以上版本, 其userAgent都是Mozilla/5.0 開頭. 因此幾乎能夠說, Mozilla瀏覽器就意味着"現代通用瀏覽器". 更有意思的是, IE11 的appName居然改爲了Netscape, 而再也不是Microsoft Internet Explorer, 從種程度上來講, IE10便是最後一版"IE".
那麼對於不想或不能安裝.net 4.5.1的服務器如何處理? 沒辦法, 只能手工處理.
實際上這個瀏覽器定義文件也很簡單, 它位於c:\Windows\Microsoft.Net\Framework\v4.xxx\Config\Browsers\ 文件夾下, (對於64位的服務器,會有Framework和Framework(64)兩個文件夾, 我看了一下,這兩個文件夾下的瀏覽器定義文件是同樣的, 到底是哪一個在起做用, 我也不清楚, 保險起見, 修改的時候最好兩個地方都改) 在這個文件夾下會看到10個左右擴展名爲.browser的文件, 其中ie.browser便是用來識別ie6-10 的, default.browser是默認的"不能識別的瀏覽器", generic.browser中保存着對Mozilla瀏覽器的處理方式. 所以, 須要修改的就是這個文件.
用任意文本編輯器打開generic.browser, (保險起見, 最好先備份一下原文件)修改其內容以下:
<browsers> <browser id="GenericDownlevel" parentID="Default"> <identification> <userAgent match="^Generic Downlevel$" /> </identification> <capture> </capture> <capabilities> <capability name="cookies" value="false" /> <capability name="ecmascriptversion" value="1.0" /> <capability name="tables" value="true" /> <capability name="type" value="Downlevel" /> </capabilities> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" /> </controlAdapters> </browser> <browser id="Mozilla" parentID="Default"> <identification> <userAgent match="Mozilla" /> </identification> <capture> </capture> <capabilities> <capability name="browser" value="Mozilla" /> <capability name="cookies" value="true" /> <capability name="ecmascriptversion" value="3.0" /> <capability name="frames" value="true" /> <capability name="inputType" value="keyboard" /> <capability name="isColor" value="true" /> <capability name="isMobileDevice" value="false" /> <capability name="javascript" value="true" /> <capability name="javascriptversion" value="1.5" /> <capability name="maximumRenderedPageSize" value="300000" /> <capability name="screenBitDepth" value="8" /> <capability name="supportsBold" value="true" /> <capability name="supportsCallback" value="true" /> <capability name="supportsCss" value="true" /> <capability name="supportsDivNoWrap" value="true" /> <capability name="supportsFileUpload" value="true" /> <capability name="supportsFontName" value="true" /> <capability name="supportsFontSize" value="true" /> <capability name="supportsImageSubmit" value="true" /> <capability name="supportsItalic" value="true" /> <capability name="supportsMaintainScrollPositionOnPostback" value="true" /> <capability name="supportsMultilineTextBoxDisplay" value="true" /> <capability name="supportsXmlHttp" value="true" /> <capability name="tables" value="true" /> <capability name="tagwriter" value="System.Web.UI.HtmlTextWriter" /> <capability name="type" value="Mozilla" /> <capability name="w3cdomversion" value="1.0" /> </capabilities> </browser> <!-- See WebKitDetect.js --> <browser id="WebKit" parentID="Mozilla"> <identification> <userAgent match="AppleWebKit" /> </identification> <capture> <userAgent match="AppleWebKit/(?'layoutVersion'\d+)" /> </capture> <capabilities> <capability name="layoutEngine" value="WebKit" /> <capability name="layoutEngineVersion" value="${layoutVersion}" /> </capabilities> </browser> <gateway id="WebKitMobile" parentID="WebKit"> <identification> <userAgent match="Mobile( Safari)?/(?'iOSVersion'[^ ]+)" /> </identification> <capture> <userAgent match="Mozilla/5.0 \((?'deviceName'[^;]+)" /> </capture> <capabilities> <capability name="mobileDeviceModel" value="${deviceName}" /> <capability name="isMobileDevice" value="true" /> <capability name="ecmascriptversion" value="3.0" /> <capability name="javascript" value="true" /> <capability name="javascriptversion" value="1.6" /> <capability name="w3cdomversion" value="1.0" /> <capability name="supportsAccesskeyAttribute" value="true" /> <capability name="tagwriter" value="System.Web.UI.HtmlTextWriter" /> <capability name="cookies" value="true" /> <capability name="frames" value="true" /> <capability name="supportsCallback" value="true" /> <capability name="supportsDivNoWrap" value="false" /> <capability name="supportsFileUpload" value="true" /> <capability name="supportsMaintainScrollPositionOnPostback" value="true" /> <capability name="supportsMultilineTextBoxDisplay" value="true" /> <capability name="supportsXmlHttp" value="true" /> <capability name="tables" value="true" /> </capabilities> </gateway> </browsers>
保存後, 回退到v4.xxx 文件夾下, 執行aspnet_regbrowsers -i, 而後執行iisreset 重啓IIS服務便可.