惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
Jina AI
Jina AI
博客园 - 司徒正美
雷峰网
雷峰网
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
I
InfoQ
博客园 - Franky
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
T
Threatpost
Cloudbric
Cloudbric
D
Docker
M
MIT News - Artificial intelligence
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Vercel News
Vercel News
Martin Fowler
Martin Fowler
J
Java Code Geeks
AWS News Blog
AWS News Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
Help Net Security
Help Net Security
C
Cisco Blogs
V
V2EX
博客园 - 【当耐特】
I
Intezer
爱范儿
爱范儿
F
Fortinet All Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
P
Privacy International News Feed
IT之家
IT之家
L
LINUX DO - 最新话题
B
Blog RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - Jailu

如何在IIS5.1/IIS6.0上使用ASP.NET URL Routing 如何在Web Form中使用URL Routing? Linq to SQLite使用笔记 Response.ContentType 详细列表 如何利用Google Code的SVN显示Html页面 Windows7下IIS7的安装及ASP配置方法 [原]分享几个日常开发中经常用到的软件 ASP.NET中Cookie问题求教 解决FF中的bug:JavaScript focus() throws "Permission denied to get property XULElement.selectedIndex" 开心网辅助程序--开心网争车位助手正式发布(含源码) 开心网辅助程序开发手记(四):贴条功能+逻辑停车+简单界面 开心网辅助程序开发手记(三):实现停车功能 HTML:对话框插件thickbox使用技巧 - Jailu - 博客园 开心网辅助程序开发手记(二):获取好友私家车位信息 [程序收藏]把Unicode转成汉字 开心网辅助程序开发手记 原来.NET Framework 2.0也是支持母版页嵌套的 Fire event in IE & Firefox 【转】FireFox与IE开发上的一些区别
[原]请留心asp:Image控件中的ImageUrl属性
Jailu · 2008-12-24 · via 博客园 - Jailu

今天快下班的时候,打开自己做的页面,在页面上(用的是Firefox)随便点点,检查看看有没有什么地方要修改的。但就是这简单的动作,切发现了一个让我郁闷的、同时也花了我将近两个小时才解决的问题----空间首页发生“二次回调”(感谢网友的指正,本文中所指的二次回调指的是首页被请求了两次)了

先说说造成二次请求的元凶:Image控件的ImageUrl属性!

通常,我们都用Image控件来显示图片,图片的路径就是通过ImageUrl来指定的,这都没错,但是,如果用了Image控件,又不给ImageUrl赋值,二次请求的问题就来了。

Image控件被服务器解析后,ImageUrl会被转换成img的src属性用来标识图片的路径,浏览器会根据src属性来请求图片。当src属性为空时,浏览器会请求当前页面,这就造成了二次回调。这个回调还是一个标准的PostBack,虽然这个PostBack不影响现有页面,但是这个PostBack会向服务器再请求一次页面,必然会给服务器带来额外的压力。

解决方法:如果使用了Image控件,请务必给ImageUrl赋值!

=================================================================

感谢木野狐(Neil Chen)对这个问题做出的更加地道的解释:

问题的根本原因在于,HTML 中 <img /> 如果不设置 src 属性没有关系,但是如果设置一个空字符串作为该属性的值:
<img src="" />
这时就相当于有了一个默认值为 "./", 也就是对当前目录下默认文档的请求。

所以,当图片加载时,会根据 src 指定的值去读取这个 url 的输出,这里只是发出了一个 GET 请求,而不是 POST, 所以没有 Postback 一说。

而你恰好测试的是网站首页,正好是该目录的默认文档,所以就被 "./" 这个路径给引用到了。


你可以用一个简单的 HTML page 来测试,而不用 aspx,就会很明了了。

最后的结论是,这个问题不能怨 asp.net,也不能怨 ImageUrl 控件,充其量只能怪它多输出了一个无用的 url="" 属性(在没有指定 ImageUrl 的情况下),其最坏结果也只是多发出了一次对该目录下默认文档的请求而已,并不会带来什么严重后果。

=================================================================

其中对于木兄说的“并不会带来什么严重后果”,我还是有点疑问:这个原本对图片的请求被转移到请求页面上了,如果被请求页面的Page_Load事件中有影响性能或功能的代码,这难道不会给网站的性能和功能带来影响?

在下图,通过分析Request Header中的Accept,不难发现浏览器第一次请求服务器时是正常的请求(text/html,application/xhtml+xml),第二次则是在请求图片(image/png,image/*):


下面简单的说说揪出元凶的过程:

1.  排除浏览器导致二次请求的可能性:由于是在Firefox中发现问题的,于是用IE打开页面,用HttpAnalyzer监听发现二次回调还是存在

2.  排除MasterPage导致二次请求的可能性:由于页面用到了MasterPage,打开其他也使用同意个MasterPage的页面,仔细检查发现除首页外,其他页面不存在二次请求的问题,排除MasterPage出错的可能性

3.  排除Javascript导致二次请求的可能性:在Firebug中,把Javascript禁用后,刷新页面,发现二次请求还是存在

4.  排除后台代码导致二次请求的可能性:把后台代码全部注释,刷新页面,发现二次请求还是存在

5.  经过上面的排除法,现在只剩下前台页面的造成二次请求的可能性了,虽然页面代码不少,但为了解决问题,还是硬着头皮上:经过漫长的注释前台代码,刷新页面,功夫不负有心人,终于让我发现原来是asp:Image造成了二次请求!

有兴趣的朋友,可以点击下载代码实验一下!