• 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”等这样的字符转换成我们原本要表示的字符。

  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/BrokenIce/p/5685965.html
Copyright © 2020-2023  润新知