学习交流,欢迎转载。转载请注明文章来源:http://www.cnblogs.com/lgjspace/archive/2011/10/13/2218283.html
细节:
由于 div,label 等标签不同于 input 标签,没有 name 和 value 属性,因此就算把这些 div,label 等的标签放在 <form></form> 标签中作为表单来提交也提交不到服务器上,因为页面提交表单时只会提交表单中的 input、textarea、select 等标签中的 name value 对,不会提交其他的元素值或标签值。
细节:
在“div 版的数值自增”案例中,div 存储的值不能作为表单提交到服务器端,因此需要一个放到 form 标签中的 type 为 hidden 的 input 标签作为存储和提交 div 中的值的容器,把 div 的 innerText 值和 hidden 的 value 值设成相同的占位符(如:@value),后台把占位符 Replace() 时就会把两者同时更改,实现“div 和 hidden 的值同步更新”的效果,同时更新后的 hidden 值会在下一次提交表单时作为“ div 显示的值的标记”的身份来提交给服务器。
亦即,div 只是“沾了 hidden 的 value 的光”而已,实际上真正和服务器进行数据交换的是 hidden 的 input。
细节:
如上面一段话所说,为非表单标签向服务器传输数据的幕后功臣是 hidden 的 input。其实这就是后面讲到的 ViewStatic 的原理和机制。
细节:
1. 在“TextBox 版本的数值自增”和“label 版本的数值自增”两个案例中,Label 版本的值存到了 ViewState 中,而 TextBox 版本的则没有被存到 ViewState 中,因为 TextBox 就是 input,自身就可以实现存储及提交数据的功能,不用依赖于 ViewState。
2. ViewState 只是存储不可以自己提交值的非表单控件标签中(而且是需要提交给服务器)的值,不会存储可以自己提交值的表单标签中的值。
细节:
在“数值自增同时宽度自增 TextBox 版本”案例中,之所以在服务器能读取提交时客户端页面的宽度,就是因为客户端页面 把宽度放到了隐藏字段 ViewState 中作为表单一起提交到服务器了。
方法:
1. 在 WebForm 中,每个控件都有一个 EnableViewState 属性,默认为 true,把改属性的值设为 false 即可禁用该控件自身的 ViewState。
2. 除此以外,也可以禁用整个页面的 ViewState,方法是:在需要禁止的 aspx 页面代码的最顶端类似于“<%@ 内容 %>”的行内加上“EnableViewState = "false"”即可。
3. 在内网系统、互联网的后台等访问人数较少、服务器压力不大的场合下可以尽情的使用 ViewState,此时 ViewState 对性能的影响不大。
原理:
之所以有 ViewState、隐藏字段、IsPostBack 等东西,都是因为 http 是一个无状态的协议,每次打开或提交页面都没有保存状态的能力。
经验:
状态信息保存在隐藏字段(ViewState)中的缺点:
加大网站的流量、降低访问速度、机密数据放到表单中会有数据欺骗等安全性问题。
细节:
禁用页面级别的 ViewState 后,只有“控件的新值会受上一次提交给服务器之前的值的影响”的控件或标签的值受影响,其他的都不会受影响。
细节:
Session 机制的由来:
为了应对 ViewState 机制存在的状态数据导致的安全性问题,引入了类似于“银行存款存折”的策略,用户的余额信息保存在服务器端,用户所持有的只是一个唯一的账号,该账号同时存在于服务器中,用来标识该用户所对应的服务器中的用户存款信息,每当用户要查询余额信息时,服务器首先检查一下客户端提交上来的账号是否和本地服务器中的某个账号相同,相同则表示该用户在本服务器中有余额信息数据,否则表示没有该用户的余额信息数据。
细节:
1. 在服务器端 aspx.cs 页面中给客户端的浏览器设置 Cookie 可以用“Response.SetCookie(new HttpCookie(cookieKey, cookieValue))”方法。
2. 由于客户端浏览器提交表单时会连同对应的 Cookie 一起提交给服务器端,即 Cookie 的提交方向是从客户端到服务器端的,因此,要读出客户端提交过来的 Cookie 数据是用“Request.Cookies["cookieKey"].Value”,而网客户端写入 Cookie 数据是用“Response.SetCookie(new HttpCookie(cookieKey, cookieValue))”。
细节:
之所以在服务器端可以读取和设置客户端的 Cookie,就是因为在客户端提交页面时,不仅仅是提交了表单,还把已经存储在本地客户端的与该域名对应的 Cookie 也提交到服务器端了,这是强制要求的(除非你禁用了 Cookie)。同时,服务器返回的数据除了普通的 html 页面数据以外,还会返回经修改后的 Cookie,然后浏览器把拿到的 Cookie 值更新到本地浏览器的 Cookie 中。
(优化网站)技巧:
大网站的网页域名和图片域名是不同的,这样可以减少 Cookie 的体积,有效降低 Cookie 对流量的消耗,因为客户端提交表单时一并发送该域名对应的所有本地 Cookie 的行为时强制性的,如果把两中性质的网站的域名分开,能有效降低每个域名的 Cookie 体积,以降低提交 Cookie 信息时的带宽占用及流量损耗。
细节:
不同的域名的多个网站并不代表这些网站存放在不同的服务器中,域名不同的网站可以同时放在一台服务器中。
细节:
一般处理程序(*.ashx)继承了 IHttpHandler 接口,而 ASP.NET 处理程序(*.aspx)继承自类 System.Web.UI.Page,类 System.Web.UI.Page 也是继承了 IHttpHandler 接口,因此,ASP.NET 处理程序也是一种“一般处理程序”,只是被 ASP.NET 封装过的“一般处理程序”而已。
细节:
在 ASP.NET 处理程序(*.aspx)中,对于继承自 System.Web.UI.Page 类的(而且是 Page_Load() 方法所在的类名由用户自定义的)子类(暂定类名为 C1)来说,客户端每次向服务器请求一次,类 C1 都会被 new 一个新的实例进行处理,用完了就 GC 掉,所以,通过在类 C1 中声明非静态的字段来存储或标记页面上次提交时的页面状态的想法是行不通的,除非声明的是全局性质的静态字段,如下面的代码所示:
1 public partial class Doc_tmp : System.Web.UI.Page
2 {
3 private static int num = 0; //全局变量的值不会受“客户端页面每次提交回来给服务器时都 new 一个该 Doc_tmp 类的实例”而影响
4 protected void Page_Load(object sender, EventArgs e)
5 {
6 if (false == IsPostBack)
7 {
8 this.txtInc.Text = "0";
9 }
10 }
11 protected void btnInc_Click(object sender, EventArgs e)
12 {
13 //num = Convert.ToInt32(this.txtInc.Text);
14 num++;
15 this.txtInc.Text = num.ToString();
16 }
17 }
细节:
在 WebSite 中创建的类(*.cs)文件要强制放到专门的 App_Code 中。
细节:
Cookie 不单止是和域名相关,还和客户端的浏览器相关,同一个客户端计算机中,不同的浏览器的 Cookie 也会不一样。
细节:
ASP.NET 中的 Session 是和 Cookie 相关的,如果客户端关掉 Cookie,则 Session 就会受到影响
经验:
1. 不要放太大的对象或数据到 Session 中;
2. 一般情况下,网站中的 Session 都有超时销毁的机制,防止客户端长时间占用服务器端的内存资源。
细节:
ASP.NET 自己也封装了 Session,该 Session 存储的值的类型为 object,其原理和前面自己写的 Session 一样。
细节:
Session 的应用:可以用在出于安全考虑不能让客户端随意篡改数据或状态信息的场合。
细节:
在 *.aspx 页面中,每当客户端提交表单给服务器(无论是否是第一次),*.aspx 处理程序中的 Page_Load 事件都会被触发执行一次。
细节:
Cookie 是把数据存储在客户端,Session 是把数据存在服务器端,两者目的都是保存和当前客户端相关的数据。
细节:
网站防止暴力破解的可行策略:
1. 设置验证码;
2. 设定重试次数上限;
细节:
在 *.aspx 处理程序中使用自带的 Session 可以直接以“Session["value"]”的方式设值、取值;
而在一般处理程序(ashx 文件)中,如果要引用ASP.Net封装的 Session 的话,则要在其类中继承 IRequiresSessionState 接口,引用时同时要带上“HttpContext.Current”,即要把 Session 写成“HttpContext.Current.Session”。
细节:
ASP.Net封装的 Session 是浏览器相关的,假设有三个浏览器:IE,Opera,FireFox,IE 浏览器打开的是一个 Session,如果在此同时分别用 Opera 和 FF 打开在 IE 打开的相同地址的页面,各自的 Session 都不一样,但各自浏览器中,各自里面的各个标签(页面)则是共用一个 Session 的。