zoukankan      html  css  js  c++  java
  • 慢说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”等这样的字符转换成我们原本要表示的字符。

  • 相关阅读:
    ZooKeeper基本原理
    Ubuntu上部署C# 网站 步骤简单记录
    代码生成助手
    微信授权封装,欢迎使用
    c#微信开发,使用JS-SDK自定义分享功能,分享朋友圈,分享给朋友等
    ab.exe使用
    【分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
    SVN服务器搭建(一)
    MVC四大筛选器—ActionFilter&ResultedFilter
    MySQL参数化查询的IN 和 LIKE
  • 原文地址:https://www.cnblogs.com/qiufuwu618/p/2755411.html
Copyright © 2011-2022 走看看