首页 > 代码库 > [bug] VS2013 Brower Link和Aspnetpager引发的问题分析

[bug] VS2013 Brower Link和Aspnetpager引发的问题分析

概述

在ie11上浏览页面的时候,突然发现在使用Aspnetpager的页面会有一个bug。

开发环境:win8.1+vs2013+ie11.

项目描述:这个问题出现在内容页中,应用了母版页。

解决方案

查了很多解决方案,最后将vs2013中

将该勾取消,再次浏览,你会发现就正常了,虽然该功能很强大,但是并不是什么时候都需要。希望对你有所帮助。

既然问题出了,那就得问一个为什么?

首先得知道什么是 Browser Link ?

这个 Browser Link 的功能就是通过一个脚本文件架起流程器和 Visual Studio IDE 之前的一个通信桥梁, 在启用 Browser Link 后, Visual Studio 会给网站注入一个 IHttpModule 模块对象, 然后在每个页面都会注册一段上面的脚本。

Browser Link 功能使用 SignalR 技术实现的。

说了这么多, Browser Link 功能到底是用来干什么用的?

现在 Broswer Link 功能比较简单,就是用来在 Visual Studio IDE 可以刷新浏览器中已经打开的页面, 为什么要在 Visual Studio IDE 中刷新页面?

有这么一个应用场景:假如你在开发一个页面,这个页面需要兼容 IE, GOOGLE, FIREFOX 和移动浏览器, 有可能你会同时使用这些流程器打开你的页面, 如果发现有某种问题,回到 VS IDE 进行修改, 修改完后可以在 Visual Studio IDE 点 "Refresh Linked Browsers" 来刷新所有浏览器以查看效果。

现在这个 "Browser Link " 只有这么一个刷新功能, 但是 Browser Link 功能可以编写扩展功能,可以自定义一些自己需要的功能。

Browser Link是连接VS和浏览器之间的通道。有了这个特性,web程序就能够和VS交互传递数据。这个特性在VS2013中是默认开启的。当开启了Browser Link, web程序运行的时候,就会注册一个HttpModule到asp.net的生命周期中,这个HttpModule的功能就是在每个输出的网页中,注入一段<script>脚本,这段脚本的作用就是负责VS IDE和网页间的通讯。

那么看看在启用Brower Link下会出现什么?

首先看一下Aspnetpager

BrowerLink生成的script

当开启了Browser Link, web程序运行的时候,就会注册一个HttpModule到asp.net的生命周期中,这个HttpModule的功能就是在每个输出的网页中,注入一段<script>脚本,这段脚本的作用就是负责VS IDE和网页间的通讯。

难道因为BrowerLink 影响了AspnetPager控件生命周期才造成这个bug的吗?

禁用BrowerLink后

可以正常浏览,aspnetpager控件也能正常使用。

通过对比可以发现,开启BrowerLink后,多了script和__EVENTVALIDATION的input。

__EVENTVALIDATION作用

__EVENTVALIDATION只是用来验证事件是否从合法的页面发送,只是一个数字签名,所以一般很短。
“id”属性为“__EVENTVALIDATION”的隐藏字段是ASP.NET 2.0的新增的安全措施。该功能可以阻止由潜在的恶意用户从浏览器端发送的未经授权的请求.
为了确保每个回发和回调事件来自于所期望的用户界面元素,ASP.NET运行库将在事件中添加额外的验证层。服务器端通过检验表单提交请求的内容,将其与“id”属性为“__EVENTVALIDATION”隐藏字段中的信息进行匹配。根据匹配结果来验证未在浏览器端添加额外的输入字段(有可能为用户在浏览器端恶意添加的字段),并且该值是在服务器已知的列表中选择的。ASP.NET运行库将在生成期间创建事件验证字段,而这是最不可能获取该信息的时刻。像视图状态一样,事件验证字段包含散列值以防止发生浏览器端篡改。 说明:“id”属性为“__EVENTVALIDATION”隐藏字段一般在表单的最下方,如果表单在浏览器端尚未解析完毕时,用户提交数据有可能导致验证失败。

总结

开启与关闭Brower Link差别的在前端源码中可以看到 多了一个script 块,一个hidden,猜测在__EVENTVALIDATION阻止了从浏览器端发送的未经授权的请求,而“input#ctl00$ContentPlaceHolder1$Pager_input”被认为不符合语法要求,造成该问题的。这不知道是BrowerLink的原因,还是AspnetPaer的原因,水平有限,只能分析道这里,如果你有更好的说法,麻烦分享一下。

[bug] VS2013 Brower Link和Aspnetpager引发的问题分析