一、概要
当我们创建一个一般处理程序Handler.ashx时,我们可以在文件中看到这一句
public void ProcessRequest (HttpContext context)
HttpContext 类是.NET Framework 类库中很重要的一个类。它封装有关个别 HTTP 请求的所有 HTTP 特定的信息。
HttpContext的命名空间:System.Web
HttpContext的程序集:System.Web(在 system.web.dll 中)
为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 Request、Response 和 Server 属性的访问。
例如:我们可以这样用Response
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
1.生存周期:从客户端用户点击并产生了一个向服务器发送请求开始---服务器处理完请求并生成返回到客户端为止。注:针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例。
2.为什么会有HttpContext类呢:在ASP年代大家都是通过在.asp页面的代码中使用Request、Respose、Server等等这些Http特定信息的。但在ASP.NET时代,这中方式已经无法满足应用,(比如我们要在IHttpModule中处理Request时,我们使用什么方法来获取呢?于是就产生了HttpContext类,它对Request、Respose、Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用)。
3.特殊性:当然HttpContext不仅仅只有这点功能.ASP.NET中它还提供了很多特殊的功能。例如Cache、还有HttpContext.Item,通过它你可以在HttpContext的生存周期内提前存储一些临时的数据,方便随时使用。
二、Items
ASP.NET提供了很多变量来管理状态:比如application state,session state,view state等。这里介绍一种通过HttpContext类的Items(属性) 集合来保存Http状态。
HttpContext对象只针对一个单一的http请求(注意http的无状态)。这个类的属性还有Request对象、Response对象、Session对象等。你可以通过Context.Items["MyObject"] = new object();或 object o = Context.Items["MyObject"];来set或get 它。Items包含了key-value形式的哈希表对象。
主要用法:
1、在两个表单之间传递数据,看下面的代码:
对于WebForm1:
private void Page_Load(object sender, System.EventArgs e) { ArrayList list = new ArrayList(4); list.Add("This list "); list.Add("is for "); list.Add("WebForm2 "); list.Add("to see. "); Context.Items["WebForm1List"] = list; Server.Transfer("WebForm2.aspx"); }
//特别说明Server。Transfer是在服务器直接操作的的和调用的地方属于同一次http请求,此处如果使用Response.Redirect则再WebForm2中再次访问Context.Items["WebForm1List"]时,Context.Items["WebForm1List"]null,因为Response.Redirect是重新发起了一次Http请求
对于WebForm2:
private void Page_Load(object sender, System.EventArgs e) { ArrayList list = Context.Items["WebForm1List"] as ArrayList; if(list != null) { foreach(string s in list) { Response.Write(s); } } }
在WebForm1的页面加载过程中,通过Server.Transfer方法,将WebForm1的状态传递到了WebForm2,WebForm2可以得到它,并作一些相应的处理。用法1也可以用Session来做。
2、截获Http请求并作特殊处理
主要是用在Application_BeginRequest方法里。Application_BeginRequest方法在global.asax.cs里定义。你可以在Http请求刚刚开始的时候,截获他,做一些特殊的处理。这里你不能用Session来做,因为此时Session对象还没有被建立。
利用Context.Item集合,你可以在Http请求的整个生命期,通过HttpModules, HttpHandlers, Webforms, and Application 事件。
三、Request
ASP.NET RequestRequest封装了客户端请求信息,是从客户端得到数据,常用的三种取得数据的方法是:Request.Form、Request.QueryString,Request。其第三种是前两种的一个缩写,可以取代前两种情况。而前两种主要对应的Form提交时的两种不同的提交方法:分别是Post方法和Get方法。
ASP.NET Request对象的属性和方法比较多,常用的几个为:UserAgent 传回客户端浏览器的版本信息,UserHostAddress 传回远方客户端机器的主机IP 地址,UserHostName 传回远方客户端机器的DNS 名称,PhysicalApplicationPath 传回目前请求网页在Server 端的真实路径。
ASP.NET Request对象使用之从浏览器获取数据
利用ASP.NET Request对象方法,可以读取其他页面提交过来的数据。提交的数据有两种形式:一种是通过Form表单提交过来,另一种是通过超级链接后面的参数提交过来,两种方式都可以利用Request对象读取。
﹤%@ Page Language="C#"%﹥ ﹤% string strUserName = Request["Name"]; string strUserLove = Request["Love"]; %﹥ 姓名:﹤%=strUserName%﹥ 爱好:﹤%=strUserLove%﹥ ﹤form action="" method="post"﹥ ﹤P﹥姓名:﹤input type="TEXT" size="20" name="Name"﹥﹤/P﹥ ﹤P﹥兴趣:﹤input type="TEXT" size="20" name="Love"﹥﹤/P﹥ ﹤P﹥﹤input type="submit" value="提 交"﹥﹤/P﹥ ﹤/form﹥
ASP.NET Request对象使用之得到客户端的信息
利用Request对象内置的属性,可以得到一些客户端的信息,比如客户端浏览器版本和客户端地址等等
﹤%@ Page Language="C#"%﹥
客户端浏览器:﹤%=Request.UserAgent %﹥
客户端IP地址:﹤%=Request.UserHostAddress %﹥
当前文件服务端物理路径:﹤%=Request.PhysicalApplicationPath %﹥
Request常见的属性有:
属性名 |
值类型 |
说明 |
ApplicationPath |
String |
获取请求的资源在网站上的根路径 |
ContentEncoding |
Encoding |
设置请求对象的编码 |
Cookies |
HttpCookieCollection |
客户端发送到服务器的Cookie集合 |
QueryString |
NameValueCollection |
当前请求的查询字符串集合 |
UrlReferrer |
Uri |
获取用户由哪个url跳转到当前页面 |
四、Response
Response代表了服务器响应对象。每次客户端发出一个请求的时候,服务器就会用一个响应对象来处理这个请求,处理完这个请求之后,服务器就会销毁这个相应对象,以便继续接受其它客服端请求。
Response常用属性如下:
属性名 |
值类型 |
说明 |
Charset |
string |
表示输出流的所使用的字符集 |
ContentEncoding |
Encoding |
设置输出流的编码 |
ContentLength |
Int |
输出流的字节大小 |
ContentType |
string |
输出流的HTTP MIME类型 |
Cookies |
HttpCookieCollection |
服务器发送到客户端的Cookie集合 |
Output |
TextWriter |
服务器响应对象的字符输出流 |
RedirectLocation |
string |
将当前请求重定向s |
Response常用方法如下:
方法名 |
返回值类型 |
说明 |
AppendCookie |
void |
向响应对象的Cookie集合中增加一个Cookie |
Clear |
void |
清空缓冲区中的所有内容输出 |
Close |
void |
关闭当前服务器到客户端的连接 |
End |
void |
终止响应,并且将缓冲区中的输出发送到客户端 |
Redirect |
void |
重定向当前请求 |
关于Response.Redirect和Server.Transfer:
response.redirect其实上是当服务器碰到这条语句时发送一条指令(包含新的地址)给浏览器,然后让浏览器去发送http请求,请求response.redirect后面的那个新的http地址,流程如下:
浏览器文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器->浏览器请求执行新的地址(服务器返回的Response.Redirect后面的地址)这就是一个小小的Response.Redirect的全部过程, Server.Transfer语句当接受地址后是直接转向后面的地址,流程如下:
浏览器文件请求->服务器执行->遇到Server.Transfer语句->服务器转向新的文件。
Server.Transfer方法与Redirect方法相比另一个显著的优势是在页面转换时,Request集合里的内容不会丢失(同一个http请求),这给我们编程带来很大的方便.
一般的情况下尽可能用Server.Transfer方法(前提是服务器是IIS),Server.Transfer方法更快速,而且因为只在服务器上执行,所以可以和任何浏览器兼容。
五、Server
Server对象是用于获取服务器的相关信息的对象。它常用方法如下:
属性名 |
返回值类型 |
说明 |
Execute |
void |
执行指定的资源,并且在执行完之后再执行本页的代码 |
HtmlDecode |
string |
消除对特殊字符串编码的影响 |
HtmlEncode |
string |
对特殊字符串进行编码 |
MapPath |
string |
获取指定相对路径在服务器上的无力路径 |
Transfer |
void |
停止执行当前程序,执行指定的资源 |
UrlDecode |
string |
对路径字符串进行解码 |
UrlEncode |
string |
对路径字符串进行编码 |
上面的方法光从概念上来说,似乎还是让人不能分清他们到底有什么作用,特别Excure/ Transfer、HtmlEncode(HtmlDecode)/ UrlEncode(UrlDecode)这两组。在讲述他们分别之前先讲述MapPath这个方法的作用,在我们上传文件的时候要以物理路径保存上传文件到服务器,而我们使用得最多的是相对URL地址,这个方法就起到了将相对URL地址转换成服务器物理路径的作用。为了说明Excure/ Transfer及HtmlEncode(HtmlDecode)/ UrlEncode(UrlDecode)的区别,我们还是用实例代码来展示:
<ul> <li>Server.MapPath(".")=<%=Server.MapPath(".")%></li> <li><%=Server.HtmlEncode("<h1>Server---HtmlEncode</h1>")%></li> <li><%=Server.HtmlDecode("<h1>Server---HtmlDecode</h1>")%></li> <li><h1>Server---Nothing</h1></li> <li><%=Server.UrlEncode("<a href=\"http://www.cnblogs.com/qiufuwu618\">深秋叶落</a>")%></li> <li><%=Server.UrlDecode("<a href=\"http://www.cnblogs.com/qiufuwu618\">深秋叶落</a>")%></li> <li><a href="http://www.cnblogs.com/qiufuwu618">深秋叶落</a></li> </ul>
从Server.MathPath(“.”)证明确实能获取到相对路径的在服务器上的实际物理地址。
在上面的例子中我们想在网页中输出HTML代码,如果直接输出往往得不到想要的效果,这时可以借助HtmlEncode方法对要输出的HTML代码进行编码,这样输出到浏览器上的时候就能看到HTML代码(包含html标志),而不是HTML形式的效果。HtmlDecode方法则是用来消除这种影响。
如果我们直接输出“<a href="http://www.cnblogs.com/qiufuwu618">深秋叶落</a>”这个字符串的话,在网页上会显示一个超级链接,但是有时候我们希望把这个超级链接作为QueryString的一个参数,由于url地址的特殊性,比如“:”、“/”等字符串在URL地址中有特殊的含义,要想输出这些字符,直接输出是不行的,需要进行某种转换,并且将来还能转换回来。经过UrlEncode方法转换之后,“:”、“/”分别转换成了“%3a”和“%2f”这样的字符,并且汉字也进行了转换。UrlDecode方法则是将“%3a”和“%2f”等这样的字符转换成我们原本要表示的字符。