.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 的浏览器定义文件的更多相关文章

  1. 可用于在 Microsoft.NET Framework 4.0 中的 ASP.NET 浏览器定义文件的修补程序

    http://support.microsoft.com/kb/2600088 此修补程序为 Internet Explorer 和 Mozilla Firefox 在浏览器定义文件引入了更新的定义. ...

  2. ASP.NET浏览器定义文件及IE兼容模式

    由于ASP.NET4.0中的一个小bug,导致了ASP.NET WebForms控制的CallBack无效,部分控件无法使用. 解决方法是在项目中添加自定义的浏览器定义文件,参考这里:http://w ...

  3. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  4. 2016-03-15:关于VS中模块定义文件

    1 def模块定义文件 在使用开源库libx265时,因x265项目的头文件x265中有如下的宏定义 #ifdef X265_API_IMPORTS #define X265_API __declsp ...

  5. 如何在IOS开发中在自己的framework中添加.bunble文件

    今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...

  6. TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts

    1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...

  7. JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)

    在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...

  8. Microsoft Edge浏览器下载文件乱码修复方法(二)

    之前有写过"Microsoft Edge浏览器下载文件乱码修复方法",发现很多情况下下载文件乱码问题还是存在,这里对之前内容做简单补充,希望可以帮到大家. 方法二: 默认如果提示下 ...

  9. Yii Framework隐藏index.php文件的步骤

    Yii Framework隐藏index.php文件的步骤 作者:feebas 发布于:2012-4-23 13:36 Monday 分类:Yii Framework 1.开启apache的mod_r ...

随机推荐

  1. Mysql删除重复数据保留最小的id

    在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GR ...

  2. Js日常笔记之this

    在javascript中自己创建构造函数时可以利用this来指向新创建的对象上.这样就可以避免函数中的this指向全局了,如下 var x = 2; function test(){ this.x = ...

  3. MVC数据验证Model Validation

    Required必须项验证属性 [Required] public string FirstName { get; set; } //ID编号 [ScaffoldColumn(false)] [Req ...

  4. Javascript实现真实字符串剩余字数提示

    //文本框剩余字数提示(字符大小) function textLimitCheckSj(thisArea, maxLength, SpanId) { var str = thisArea.value; ...

  5. scut客户端心跳超时和客户端断开测试

    1.断开的消息触发后,依然会触发超时 2.触发超时不会触发断开 3.超时会触发多次,断开只触发一次 超时不是很准确,好像有时候不会触发.如果要判断玩家是否下线,可以用最后一次心跳时间判断

  6. atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本

    atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本 1. 去除边框思路原理 1 2. Thumbnailator 是一个用来生成图像缩略图.裁切. ...

  7. Sublime Text 编辑器 插件 之 "Sublime Alignment" 详解

    作者:shede333主页:http://my.oschina.net/shede333版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | [Creative Commons BY- ...

  8. 使用jquery dialog

    网页开发中,弹窗还是很有必要的.本人比较喜欢jquery ui的dialog. 但是jquery dialog中也有一些略显不方便的,如:没有z-index的参数设置,脚部的按钮样式没办法自定义…… ...

  9. 关于Tensorflow 的数据读取环节

    Tensorflow读取数据的一般方式有下面3种: preloaded直接创建变量:在tensorflow定义图的过程中,创建常量或变量来存储数据 feed:在运行程序时,通过feed_dict传入数 ...

  10. 【转】Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性

    [转]Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性 Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性