ASP.NET知识点
1. aspx页面开始的<%@Page %> 称为指令集, 在编译的时候使用. 2. 前台页面与后台页面的继承关系 前台页面aspx --- 后台类aspx.cs ---Page类 -----实现了IHttpHandler接口, IHttpHandler包含ProcessRequest()方法. Control属性:控件的集合,页面上所有的代码(包括html)都以控件对象的方式存放在此集合中
2.<<<aspx页面执行过程:>>>---------------------------------------------------------------------------------- 1.--首先通过反射创建aspx前台页面(第八个事件), 第九个事件尝试将页面类对象转换成IRequeiresSessionState接口对象, 如果转换不成功,则不加载Session对象, 转换成功则从请求报文头中获得 cookie里的SessionId,然后到服务器的Session池中根据Session找到Session对象 并将其引用赋值给页面对象的Session属性 2.--然后调用反射创建的请求页面的ProcessRequest()方法(第十一与第十二个事件之间)
3.--调用父类的ProcessRequest方法,在此方法中父类调用了父类的FrameworkInitialize() 但因为被页面类重写了,所以执行的是当前页面类的FrameworkInitialize(),在中间就调用了 buildControlTree()方法,然后调用ProcessRequestMain()方法,在此方法中,执行了整个页面的生命周期 (页面生命周期,其实就是调用一系列事件的方法)
在PR方法中 执行页面类的buildControlTree()方法来构造控件树 buildControlTree()方法中传入当前前台页面类对象,作为根节点, 生成页面控件树,将页面的每个HTML代码及相应的服务端运行的控件标签(runat=server) 都以服务器端控件类对象方式封装起来. 最后当页面执行完毕,生成整个页面对象所对应的HTML页面代码时,只需要循环遍历整个控件树的每个节点 并调用每个节点的Render方法,就可以生成每个控件里所封装的Html代码了,最后组成整个页面的html 返回浏览器. 4.--执行页面生命周期的一系列方法(PageLoad(),SaveState(),LoadState()) 生命周期中有许多事件,程序员可以注册方法,并在方法中修改控件树里某个控件对象的属性 5.--通过生命周期中的方法来改变控件树中对应控件的属性,然后在调用页面的renderControl()方法生成Html代码 遍历整个控件树,调用每个控件的render方法,根据控件属性生成 并 拼成整个页面的html代码, renderControl方法()需要传入Response对象参数,实际上是一个写出器HtmlTextWriter对象. 遍历控件树时,调用每个控件的renderControl()方法,都会传入同一个HtmlTextWriter对象, 所以每个控件生成的html代码,都按照次序存在同一个HtmlTextWriter对象中, 最后只要将这个HtmlTextWriter对象中的字符串输出 就可以形成整个页面 3.为什么在Page_Load()中Response.Write()的内容 显示在HTML代码之前,打乱页面布局??? 因为页面请求时先执行Page_Load()事件,然后执行Rander()方法生成html页面
--------------------------------------------------------------------------------------------------------------- 3.WebForm 前后台页面(aspx/aspx.cs),文件在被访问时会编译成前台类和后台类 请求管道的第八个事件触发会通过反射创建的是前台类aspx,然后强转为IHttpHandler接口对象
4. 创建前台页面的后,在前台页面里可以访问其父类(后台类,Page类..)中所有的非私有成员
5.生成页面控件树的目的: 为了在服务端运行页面类对象时,可以根据用户的某些操作及环境的某些变化来修改要生成的html代码 正因为最终页面对象是要生成html代码,所以在创建封装了html代码的控件树时,就要依次添加控件.
6.在前台类中可以在<%%>里写服务器C#代码,此时可访问到后台类(父类)的非私有成员. 在前台输出 还可以使用 <%= %>
7. Request.UrlReferrer : 记录跳转页面的域名地址 Request.UserHostAddress : 服务器端是通过与客服端浏览器的套接字获取彼此的IP及端口号
8.CLR编译器会在 第一次访问aspx页面 或者 修改aspx 页面后,会重新编译生成程序集, 并将之前的的程序集标识为不可用状态,CLR内部会自己对不可用的程序集进行清理
1. runat="server" 标记该控件在服务端运行 <input type="text" id="txtName" runat="server"/> 此控件在服务器端会被运行,会变成一个对象,在服务器端可以访问到, 通过 . 可以设置一系列属性
2. Response的其他成员: 2.1 Response.Buffer=false; //关闭输出对象的内容缓存(只要调用Write就立即输出到浏览器) 2.2 Response.BufferOutput 2.3 Response.Flush() 立即一次性输出Response对象中的内容缓存(就是之前Write的内容) 2.4 Response.Clear() 清空Response对象中的内容缓存.(就是之前Write的内容) 2.5 Response.ContentEncoding 输出流的编码,指定报文体的编码方式 Response.Charset 告诉浏览器 用什么字符集解码 2.6 Response.ContentType:报文体的格式 2.7Response.End() 终止响应
3.Server 对象: Mappath();
4无状态 HTTP: ASP.NET状态保持方案: 5.Session Session存在于上下文对象Context中 在服务端存一个Session键值对 Session原理: 5.1 Session["id"]=strName; 向服务器Session池添加Session对象,将键值对存入Session对象中 同时以cookie方式向浏览器发送SessionId. 5.2在浏览器未关闭的前提下,当再次访问该网站页面时, 浏览器会自动将保存了SessionId的cookie发送到服务器来 5.3在调用页面对象的ProcessRequest方法之前, 服务器端会根据Cookie里的SessionId到Session池中去找 看是否有对应的Session对象,并且将该对象的引用设置给 HttpContext里的Session属性 5.4页面对象执行PR方法时,就直接通过Page类的Session属性 可以访问到HttpContext里的Session引用. Session操作: 销毁(取消/退出) : Session.Abandon();销毁服务端的Session 一般处理程序中访问Session对象时,必须实现IRequiresSessionState接口 标志要求使用Session状态
Session常用属性: SessionID:唯一用户会话标识符 TimeOut:用户超时,默认为20分钟 Count: Session池中 Session对象中 键值对的对数.
设置全部网页的Session或者禁用Cookie后通过url保存sessionId 需要再配置文件中设置 <SessionState ></SessionState>
6.Cookie(小甜饼): 创建Cookie对象(保存键值) 1.HttpCookie cookie=new HttpCookie("id","110"); cookie.Expires=DateTime.Now.AddDay(2);//设置失效时间 当前时间+2天 Response.Cookies.Add(cookie); 服务器获取Cookie Request,Cookies["id"].Value 删除浏览器Cookie 创建一个cookie 与登录时的cookie名相同 HttpCookie cookie=new HttpCookie("id"," "); cookie.Expires.AddDay(-2);//设置失效时间 当前时间-2天 Context.Response.Cookies.Add(cookie); Cookie的实现原理, 就是通过请求报文头和响应报文头实现的
Request.Cookies 服务器端获取Cookie Response.Cookies 向浏览器输出cookie
--------------------04-03--------------------- 1.当用户禁用浏览器所有Cookie的时候,当用户登陆的时候 浏览器接收响应报文中设置的Cookie,导致登陆失败. 解决办法: 在配置文件中设置<SessionState cookieless="AotuDetect"></SessionState> 禁用cookie后浏览器会通过url的形式传递cookie值 2.Application (服务器端一个共享的字典集合对象,每个浏览器都可以访问这个对象,操作的是同一个Application) 网站应用程序发布后,当第一个用户访问某一个页面的同时 就创建了一个Application对象(public static Dictionary <string,object>) 加锁:Application.Lock(); 解锁:Application.Unlock(); 3.页面生命周期事件执行的作用: LoadState : 获得表单提交过来的隐藏域_VIEWSTATE里的值,从中找出 1.属于服务器控件的值,然后赋给控件树里对应的控件属性 2.属于用户通过VIEWSTATE["key"]=value方式添加的值, 并赋给页面对象的VIEWSTATE属性
将VIEWSTATE中的值已经还原到 VIEWSTATE属性中 Page_Load : 用户可能要从页面VIEWSTATE属性中获取之前保存的键值对, 所以在Page_Load之前,必须将表单隐藏域里的值还原到页面VIEWSTATE 属性中 SaveState : 遍历控件树所有的控件,然后将需要保存的属性和数据以及控件名称, 保存到VIEWSTATE中
RenderControl() : Render时,要遍历控件树,调用每个控件的Render方法,从而生成整个页面的html代码 但当它执行到HtmlForm表单控件的时候,此控件的Render方法里会读取VIEWSTATE 里的每个键值对,并将他们序列化成字符串,然后进行base64编码得到一个新的字符串 最终生成一个<input type="hidden" name="__VIEWSTATE" />的隐藏域的value中.
------------------------------------- 04-05 ----------------------------------- 1.App_Code文件夹中的类文件,不允许下载访问,提示Forbidden错误消息
2.aspx文件生成程序集的时候,后台页面被动态的实现了IRequiresSessionState接口, 只有实现了该接口,才能对Session进行访问操作
-----记住用法---- 3.javascript中 获得 iframe标签中父窗体对象的引用路径 window.top.location ="Login.aspx" 控制ifram页面 跳转到 登陆页面 window.parent.location