慢说HttpContext

一、概要

当我们创建一个一般处理程序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”等这样的字符转换成我们原本要表示的字符。

原文地址:https://www.cnblogs.com/qiufuwu618/p/2755411.html