.Net framework 的瀏覽器定義文件

.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服務便可.

相關文章
相關標籤/搜索