• HttpContext对象


    封装有关个别 HTTP 请求的所有 HTTP 特定的信息。

    为继承 IHttpModuleIHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 RequestResponseServer 属性的访问。HttpContext: 保持单个用户、单个请求的数据,并且数据只在该请求期间保持。被提供用于保持需要在不同的HttpModules和HttpHandlers之间传递的值。它也可以用于保持某个完整请求的相应信息。 再结合它提供的RewriteUrl方法来看,当用户发送某个Http请求,我们可以通过HttpContext进行截获,查看里面包含了哪些请求的信息,然后可以进行一系列的操作,比如说切换到其他的页面,这个时候,可以重组请求的数据满足新页面的要求。

    那么在link.aspx中需要判断是进入哪一种的采购流程,切换到不同的页面 PrintBook.aspx 或者 EBook.aspx。

    所以这个Http请求需要涉及两个页面,针对每个页面link.aspx和printBook.aspx或者EBook.aspx都会各自存在一个httpRequest,但是却共用同一个httpContext。

    切换需要使用Server.Transfer方法,〔直接在Server上进行其他页面的调用,保证是同一个HttpContext,信息不会丢失。〕。而不是Response.Redirect(它是将Response发送回浏览器,然后浏览器再发送了一个新的请求给目标页面,是两个不同的HttpContext了)。

         //Link.aspx 检查商品的类型进行切换
             protected void Page_Load(object sender,EventArgs e)
             {
                  string sType = GetProductType(Request["id"].ToString()); 

                  //id参数写入Context
                  Context.Items.Add("id",Request["id"]); 

                  if(sType=="print")
                  {
                       Context.Items.Add("NeedCount",Request["NeedCount"]);
                      //
    不需要写Url+参数的形式
                       Server.Transfer("PrintBook.aspx");
                  }
                  else
                  {
                       Server.Transfer("EBook.aspx");
                  }
             }

             //PrintBook.aspx 获得相关的数据,继续其他的操作
             protected void Page_Load(object sender,EventArgs e)
             {
                   //
    Context中获得参数
                  Response.Write(Context.Items["id"]);
             }

    而Rewriterpath方法是指重写请求的路径,并不是转换页面,因为通常Http请求的Url不一定对应有相关的页面,那么在Application_BeginRequest中去检查Url请求,如果符合一定条件就可以RewritePath,就是将莫须有的Url请求对应出存在的页面。

    比如说通常的404 Page Not Found,有些网站会提供很有趣的页面,就是这样的实现机制。当然这种机制是WebServer来实现的,原理是相同的。


    http://msdn.microsoft.com/zh-cn/library/system.web.httpcontext(VS.80).aspx    msdn

    以前的时候,自己读了一篇关于HttpContext的文章,直到今天我才知道自己以前原来都被它误导了,使我误解为HttpContext是存在整个用户请求的生命周期,而实则上只存在单个的请求中

    引用一篇文章如下,希望对大家有所帮助

    一、介绍
        ASP.NET提供了很多变量来管理状态:比如application state,session state,view state等。这里介绍一种通过HttpContext类的Items(属性) 集合来保存Http状态。
        HttpContext对象只针对一个单一的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");
    }

    对于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 事件。

  • 相关阅读:
    面试题_回溯法
    面试题专题_目录
    面试题_有序数组的二分法解法
    Linux 信号捕获堆栈信息
    Git 简单基础命令的应用
    【转】【C#】常用ToString()方法总结
    【转】【Revit】Revit 二次开发 特殊族实例参照获取
    使用移除图片背景(提取人像)的开源项目rembg
    X64Dbg 介绍>表达式
    0314遗忘的角落,一文说清什么是测试策略
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/1556066.html
Copyright © 2020-2023  润新知