img标签的src=""会引起的Page_Load多次执行

今天看见园子里有人因img的src为空导致session丢失,详情见http://www.cnblogs.com/kyneblog/archive/2009/06/11/1500999.html

以前一直没注意这个,所以晚上特地写了一段代码验证:

Default.aspx后台代码:

using System;
using System.Web;
using System.IO;

namespace src
{
 public partial class _Default : System.Web.UI.Page
    {
 protected void Page_Load(object sender, EventArgs e)
        {
            WriteLog();
        }


 public static void WriteLog()
        {
 string _logFile = HttpContext.Current.Server.MapPath("log/log.txt");

 using (StreamWriter sw = new StreamWriter(_logFile, true))
            {
 string s = string.Format("{0} {1}", HttpContext.Current.Request.Url.AbsoluteUri.ToString(), DateTime.Now.ToString());
                sw.WriteLine(s);
                sw.Close();
            }
        }
    }
}

代码很简单,页面每次打开,都会在log/log.txt中追加一行记录,内容为“当前页的绝对网址+当前时间”

前端测试代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="src._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
 <title></title>
</head>
<body> 
 <img alt="test" src="" /> 
</body>
</html>

F5运行,发现log.txt确实有二行记录(在IE,FF,Chrome下都是同样的结果)

如果把<img alt="test" src="" />   改成二个连续的img,即: <img alt="test" src="" />   <img alt="test" src="" />  

运行后,页面仍被执行2次

继续测试,把<img alt="test" src="" /> 改为  <img alt="sss" src="" onerror="this.src='http://www.baidu.com/img/baidu_logo.gif'"/>,即图片加载错误时自动加载百度的logo,保证最终src肯定有值

猜一下运行结果?

结果与不加onerror完全相同,页面仍然执行二次!(有点意外吧?哈...)

go on! 这回干脆把src=""都去掉,即改成<img alt="test" />,再次竞猜结果?

居然正常了,即仅执行了一次!(呵呵,看来多一事不如少一事)

最后再折腾一次,把src故意写成一个错误的地址,比如<img alt="test" src="http://abc.asdf.werdafsaf.sadfasdfas.xxx.gif" />

结果正常,仅执行了一次!

结论:img标签的src=""时,会引起浏览器再次访问"./"即当前目录,如果该目录下有default.aspx,index.aspx等IIS的默认文档,则默认文档会执行2次

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

一个保存数据的方法(可以切换存放的位置,可以设置密钥)

      在asp.net里面一般的生命周期都比较短,如果想要比较长久的保存数据的话,一般有选择几种方式可供选择,即cookies、ViewState、Ses...

289100
来自专栏王磊的博客

ASP.NET 缓存 Cache

ASP.NET 提供一个功能完整的缓存引擎,页面可使用该引擎通过 HTTP 请求存储和检索任意对象. 缓存的生存期与应用程序的生存期相同,也就是说,当应用程序重...

45550
来自专栏古时的风筝

ASP.NET-自定义HttpModule与HttpHandler

在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NET与IIS配合工作的机制,在http请求经过一系列处理后,最后到达ASP.NET管道中...

32080
来自专栏技术记录

RabbitMQ教程(二) ——linux下安装rabbitmq

21140
来自专栏恰童鞋骚年

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此...

27030
来自专栏ZKEASOFT

纸壳CMS的插件加载机制

纸壳CMS是基于插件化设计的,可以通过扩展插件来实现不同的功能。如何通过插件来扩展,可以参考这篇文章:

12920
来自专栏空间大数据可视化

利用iframe+from表单实现跨域上传文件

15240
来自专栏程序员的SOD蜜

使用命名管道实现进程间通信

创建命名管道 命名管道常常用于应用程序之间的通迅,由于不需要进行序列化和反序列化操作,效率是非常高的。相比TCP通信方式,效率更高,但比共享内存要低点。 命名管...

27950
来自专栏码农阿宇

EF Core利用Transaction对数据进行回滚保护

What? 首先,说一下什么是EF Core中的Transaction Transaction允许以原子方式处理多个数据库操作,如果事务已提交,则所有操作都应用...

39150
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用...

21590

扫码关注云+社区

领取腾讯云代金券