.Net framework 的浏览器定义文件
.net framework4.5.1之前的版本有一个非常愚蠢的设定, 它为每个浏览器设置了一个浏览器定义文件, 通过正则表达式来匹配浏览器的userAgent, 然后来定义一些功能集.
这种做法有一个显而易见的问题, 浏览器是会经常升级的, 每次升级后, userAgent都会有变化, 这就导致.net framework的正则表达式跟新版本的浏览器匹配失败, 于是新版本浏览器被认定为"无法识别的浏览器", 对这种"无法识别的浏览器", .net framework的决定是: 大部分的功能不予支持, 其中javascript就是不被支持的功能之一.
可笑的是,被这个愚蠢的设定伤害最深的却正是微软自己.
当.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时, 就会报错.
所以实际上,这个错误只是个表象,真正的原因是脚本被服务器端禁用了.
为了解决这个问题,微软发布了一个hotfix: http://support.microsoft.com/kb/2600088
当在服务器上安装了这个hotfix时, 就会在.net 4.0的浏览器定义文件中增加对ie10的支持.
可是,故事并没有到这里结束. 随后.net 4.5发布, .net 4.5已经内置了对ie10的支持. 但是不久, 更高版本的IE11又发布了.
让人不可理解的是, .net4.0 不支持IE10这件事, 微软应该已经从中吸取教训了, 但是结果却是没有.
上述补丁仅仅能让服务器识别IE10, 却仍然不能识别IE11, .net 4.5和.net 4.0出了一样的状况, 不能识别最新版的IE: 当用IE11访问.net 4.5的网站时, 同样将遇到脚本被禁用的问题.
这次微软大约是有点不好意思再发补丁了, 于是直到我写这篇文章时为止,仍然没有修补补丁, 官方的处理方式只有一种, 安装.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服务即可.
.Net framework 的浏览器定义文件的更多相关文章
- 可用于在 Microsoft.NET Framework 4.0 中的 ASP.NET 浏览器定义文件的修补程序
http://support.microsoft.com/kb/2600088 此修补程序为 Internet Explorer 和 Mozilla Firefox 在浏览器定义文件引入了更新的定义. ...
- ASP.NET浏览器定义文件及IE兼容模式
由于ASP.NET4.0中的一个小bug,导致了ASP.NET WebForms控制的CallBack无效,部分控件无法使用. 解决方法是在项目中添加自定义的浏览器定义文件,参考这里:http://w ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- 2016-03-15:关于VS中模块定义文件
1 def模块定义文件 在使用开源库libx265时,因x265项目的头文件x265中有如下的宏定义 #ifdef X265_API_IMPORTS #define X265_API __declsp ...
- 如何在IOS开发中在自己的framework中添加.bunble文件
今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...
- TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts
1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...
- JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)
在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...
- Microsoft Edge浏览器下载文件乱码修复方法(二)
之前有写过"Microsoft Edge浏览器下载文件乱码修复方法",发现很多情况下下载文件乱码问题还是存在,这里对之前内容做简单补充,希望可以帮到大家. 方法二: 默认如果提示下 ...
- Yii Framework隐藏index.php文件的步骤
Yii Framework隐藏index.php文件的步骤 作者:feebas 发布于:2012-4-23 13:36 Monday 分类:Yii Framework 1.开启apache的mod_r ...
随机推荐
- [转]SIGHUP与终端控制
SIGHUP信号与控制终端 UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程.一个session可能会有一个session首进程, ...
- LaTeX 中使用三级标题
需要在导言区加入命令:\setcounter{secnumdepth}{4} 而后: \section{一级标题} \subsection{二级标题} \subsubsection{三级标题}
- Centos 6.4 python 2.6 升级到 2.7一起的MySQLdb不能使用的解决问题
查看python的版本#python -V Python 2.6.6 1.下载Python-2.7.3#wget http://python.org/ftp/python/2.7.3/Python-2 ...
- javaWeb项目部署到阿里云服务器步骤 完整版
记录web项目部署到阿里云服务器步骤 (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以 ...
- 补习知识:Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- 为select的option绑定键盘事件
1. 目的 可以使用快捷键1.2.3.4等自动选中select框对应的option 2. 代码 <select id="selectItem" class="for ...
- Atitit.eclipse git使用
Atitit.eclipse git使用 1. Git vs svn1 1.1. 直接记录快照,而非差异比较1 1.2. Git的patch则不依附于branch,commit和commit之间的关系 ...
- [svc]alpha、beta、rc各版本区别
参考:http://www.ttlsa.com/linux/alpha-beta-rc/ 很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫"beta版"或者 " ...
- java之Thread Dump分析
什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机 ...
- 浅谈P2P终结者原理及其突破
P2P终结者按正常来说是个很好的网管软件,但是好多人却拿它来,恶意的限制他人的流量,使他人不能正常上网,下面我们就他的功能以及原理还有突破方法做个详细的介绍! 我们先来看看来自在网上PSP的资料:P2 ...