文件上传HttpHandler
1.HttpHandler实现图片上传
(1).表单元素使用 文件选择框<input type="file"/> 控件。
(2).表单设置enctype="multipart/form-data",本质上就是设置浏览器提交表单的数据时,使用随机分隔符来分割不同控件的数据,而且数据的组织形式由 name=value换成了数据头和数据体的方式。
(3).服务器接收客户端上传的文件使用Request.Files属性,使用HttpPostedFile的SaveAs方法将图片保存在服务器
2.HttpHandler实现文件下载
Response.AddHeader(“Content-Disposition”, string.Format(“attachment;filename=\”{0}\“”, encodeFileName));其中filename后为编码后的文件名。filename段为建议的保存文件名。
6.webForm后台代码先执行,前台代码后执行,仅从实用上面看,ashx和webform使用方式都差不多。区别:(1)被请求时,调用调用的方法吗不同:ashx--ProcessRequest,webform--Page_Load
(2)webform不需要程序员手动读取模板了
(3)访问Request和Response的时候,不再需要context
7.编译后,aspx页面变成一个类,继承aspx.cs里的类
8.webform前后台页面文件在被访问时会编译成类。
9.ViewState 属性实际上就是获得了浏览器提交过来的一个名为_VIEWSTATE的隐藏域里的值
10.在页面类对象,执行PR方法的时候,先创建了控件树,然后通过执行LoadState方法,将请求报文中的名字为 __VIEWSTATE的值,然后反base64编码,进行反序列化,最终还原成集合,然后将其中属于程序员自己添加到ViewState 里的键值对还原到 页面对象的ViewState属性中。然后才执行的Page_Load方法。
11.响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。
12.Response对象的主要成员:
Response.Buffer、Response.BufferOutput:经过Reflector反编译,发现两个属性是一样的,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认是true。Response.Flush()将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。Response.Clear()清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。Response.ContentEncoding输出流的编码。Response.ContentType 输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。Response.Cookies 返回给浏览器的Cookie的集合,可以通过它设置Cookie。Response.OutputStream 输出流,在输出图片、Excel文件等非文本内容的时候要使用它。
Response.End() 终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,End方法里调用了Flush()方法。在终止一些非法请求的时候,比如盗链等可以用End()立即终止请求。
Response.Redirect(url) 重定向浏览器到新的网址。即可以重定向到站外网址也可以重定向到站内网址。Response.Redirect("http://www.rupeng.com")、
13.Server
Server是上下文对象context的一个属性,是HttpServerUtility类的一个对象
Server.HtmlDecode()、Server.HtmlEncode() Server.UrlEncode()、 Server.UrlDecode()是对HttpUtility类中相应方法的一个代理调用。推荐总是使用HttpUtility,因为有的地方很难拿到Server对象,而且Server的存在是为以前ASP程序员习惯而留的。别把HtmlEncode、UrlEncode混了,UrlEncode是处理超链接中的中文问题, HtmlEncode是处理html代码的。还是推荐用HttpUtility.HtmlEncode。
Server.Transfer(path) 内部重定向请求,Server.Transfer(“JieBanRen.aspx”)将用户的请求重定向给JieBanRen.aspx处理,是服务器内部的接管(不能重定向到外部网站),浏览器是意识不到这个接管的,不是象Response.Redirect那样经历“通知浏览器‘请重新访问url这个网址’和浏览器接到命令访问新网址的过程”,是一次http请求,因此浏览器地址栏不会变化。因为是内部接管,所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,而Redirect则不行,因为是让浏览器去访问的。注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。 (常考)Response.Redirect就可以重定向到外部网站。
使用Server.Transfer不能直接重定向到ashx,否则会报错“执行子请求出错”.
Response.Redirect("a.htm")。Redirect是向浏览器发回302重定向(还有一个Location告诉浏览器要重定向到哪个页面),是通知浏览器“请重新访问url这个网址”,这个过程经历了服务器通知浏览器“请重新访问url这个网址”和浏览器接到命令访问新网址的过程。使用HttpWatch查看整个响应过程的Http报文。用Redirect因为是浏览器自己去重新访问新网址的,所以在地址栏中是可以看到网址的变化的。后面会用来防止刷新浏览器时提示“重试”。
Response.SetCookie(HttpCookie cookie),向输出流中更新写到浏览器中的Cookie,如果Cookie存在就更新不存在就增加。是对Response.Cookies的简化调用。
Response.Write()向浏览器输出内容。
14.无状态Http
无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。
应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。
15.常用的状态(信息)保持方式
ViewState:
ASP.NET 的 .aspx页面特有,页面级的;
就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;
服务器端控件的值都自动保存在ViewState中;
Cookie:
HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;
就是在客户端保存客户端单独使用的数据的一种方式;
就像你的病历本一样,医院直接给你带回家;
Session:和进程相关。
在服务器端保存客户端单独使用的数据的一种方式;
就像银行账户,钱都存在银行里,你就拿一张银行卡回家;
Application:
在服务器端保存共享数据的一种方式;
就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;
16.IsPostBack:
只要浏览器提交的请求报文里包含_VIEWSTATE这个键,asp.net就会将页面的IsPostBack属性设置为true
17.在HttpApplication请求管道 第9个事件的时候,根据浏览器发来的SessionId自动从服务器端Session池中读取 SessionId对应的Session对象,并赋值给当前页面对象的Session属性。如果浏览器禁用了Cookie的话,那服务器也可以通过将sessionId保存在url中来完成sessionid在浏览器和服务器间的传 递。(需要设置配置文件里的 sessionState节点的 cookieless="autodetect")
<sessionState cookieless="AutoDetect"></sessionState>
18.Cookie:
Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。
浏览器保存Cookie有两种方式:1—浏览器的内存中;2—浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间: cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效
开发场景:常用于登录和保存用户最近浏览商品
Cookie的Expires属性不可读.(只有在向浏览器写出的时候能设置)
服务器设置Cookie:
HttpCookie cok = new HttpCookie(“uId”, “10001”);//(“键”,”值”)
cok.Expires = DateTime.Now.AddDays(18);//设置失效日期-现在之后的18天后
context.Response.Cookies.Add(cok); //添加到响应中
服务器获得客户端传来的Cookie:
string strUName=context.Request.Cookies[“uId”].Value;//从请求中获得Cookie