码迷,mamicode.com
首页 > 其他好文 > 详细

13.4 上下文对象

时间:2015-11-12 13:10:54      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:

有关应用程序状态的详情、处理的请求以及构建的响应信息全部通过上下文对象来获取。下面将介绍用于提供上下文的类:HttpContext、 HttpApplication,HttpRequest,HttpResponse类,所有这些类均位于System.Web。

13.4.1 HttpContext

 Encapsulates all HTTP-specific information about an individual HTTP request. HttpContext。用于从头到尾跟踪请求的状态,它也是有关请求的所有可用信息(包括HttpRequest和HttpResponse对象)的通道。还会定义可用于管理请求生命周期的方法和属性。

名称说明
技术分享 Application

为当前 HTTP 请求获取 HttpApplicationState 对象。

技术分享 ApplicationInstance

为当前 HTTP 请求获取或设置 HttpApplication 对象。

技术分享 Cache

获取当前应用程序域的 Cache 对象。

技术分享技术分享 Current

为当前 HTTP 请求获取或设置 HttpContext 对象。

技术分享 CurrentHandler

获取表示当前正在执行的处理程序的 IHttpHandler 对象。

技术分享 CurrentNotification

获取一个 RequestNotification 值,该值指示当前正在处理的 HttpApplication 事件。

技术分享 Error

获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。

技术分享 Handler

获取或设置负责处理 HTTP 请求的 IHttpHandler 对象。

技术分享 IsDebuggingEnabled

获取一个值,该值指示当前 HTTP 请求是否处于调试模式。如果已将调试器附加到web窗体应用程序,则返回true。

技术分享 IsPostNotification

在 HttpApplication 事件完成处理之后获取 ASP.NET 管道的当前进程点的值。

技术分享 Items

获取可用于在 HTTP 请求过程中在 IHttpModule 接口和 IHttpHandler 接口之间组织和共享数据的键/值集合。返回可用于

在参与处理请求的ASP.NET Framework组件之间传递状态数据的集合。

技术分享 Profile

获取当前用户配置文件的 ProfileBase 对象。

技术分享 Request

为当前 HTTP 请求获取 HttpRequest 对象。

技术分享 Response

获取当前 HTTP 响应的 HttpResponse 对象。

技术分享 Server

获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。其中包含实用功能,最有用的功能包括:用于对字符串

进行安全编码以将其作为HTML显示的方法,以及用于控制请求处理程序执行的功能。

技术分享 Session

为当前 HTTP 请求获取 HttpSessionState 对象。

技术分享 Timestamp

获取当前 HTTP 请求的初始时间戳。

技术分享 Trace

获取当前 HTTP 响应的 TraceContext 对象。

技术分享 User

获取或设置当前 HTTP 请求的安全信息。

13.4.2 HttpApplication

          在ASP.NET Framework 中用到的许多基类都提供了一些便捷属性,这些属性与那些由HttpContext类定义的属性对应。Defines the methods, properties, and events that are common to all application objects in an ASP.NET application.

 

属性

 名称说明
技术分享 Application

获取应用程序的当前状态。

技术分享 Context

获取关于当前请求的 HTTP 特定信息。

技术分享 Events

获取处理所有应用程序事件的事件处理程序委托列表。

技术分享 Modules

获取当前应用程序的模块集合。

  RegisterModule(type)

添加一个新模块。

技术分享 Request

获取当前请求所对应的内部请求对象。

技术分享 Response

获取当前请求所对应的内部响应对象。

技术分享 Server

获取当前请求所对应的内部服务器对象。

技术分享 Session

获取提供对会话数据的访问的内部会话对象。

技术分享 User

获取当前请求的内部用户对象。

方法

技术分享 CompleteRequest()

使 ASP.NET 跳过 HTTP 执行管线链中的所有事件和筛选并直接执行EndRequest 事件。

技术分享 Dispose()

处置 HttpApplication 实例。

技术分享 Equals(Object^)

确定指定的对象是否等于当前对象。(从 Object 继承。)

技术分享 GetType()

获取当前实例的 Type。(从 Object 继承。)

技术分享 Init()

在添加所有事件处理程序模块之后执行自定义初始化代码。

技术分享 ToString()

返回表示当前对象的字符串。(从 Object 继承。)


这其中的多数成员都是HttpContext类对应的便捷属性。接下来介绍一些要注意的要点。

1.处理属性异常

     Request,Response、Session、User属性全部返回HttpContext类中对应属性的值,缺点是:如果他们从HttpContext中获得的值为null,所有这些属性将抛出HttpException。

        //使用HttpContext属性来确定当前应用程序事件。
        public Global()
        {
            BeginRequest += HandleEvent;
            EndRequest += HandleEvent;
            AcquireRequestState += HandleEvent;
            PostAcquireRequestState += HandleEvent;
        }

        protected void HandleEvent(object sender, EventArgs e)
        {
            string eventName = "<Unknown>";
            switch (Context.CurrentNotification)
            {
                case RequestNotification.BeginRequest:
                case RequestNotification.EndRequest:
                    eventName = Context.CurrentNotification.ToString();
                    break;
                case RequestNotification.AcquireRequestState:
                    if (Context.IsPostNotification)
                    {
                        eventName = "PostAcquireRequestState";

                    }
                    else
                    {
                        eventName = "AcquireRequestState";
                    }
                    break;

            }
            EventCollection.Add(EventSource.Application, eventName);

        }
        protected void Application_Start(object sender, EventArgs e)
        {
            EventCollection.Add(EventSource.Application, "Start");
            Application["message"] = "Application Events";
            CreateTimeStamp();
        }
protected void CreateTimeStamp()
        {
            string stamp = Context.Timestamp.ToLongTimeString();
            if ( Session != null)
            {
                Session["request_timestamp"] = stamp;
            }
            else
            {
                Application["app_timestamp"] = stamp;
            }
        }

 

 

 

将会报错

更新CreateTimeStamp方法以使用HttpContext属性

protected void CreateTimeStamp()
        {
            string stamp = Context.Timestamp.ToLongTimeString();
            if (Context.Session != null)
            {
                Session["request_timestamp"] = stamp;
            }
            else
            {
                Application["app_timestamp"] = stamp;
            }
        }

2完成请求

      HttpApplication.CompleteRequest方法可用于废弃请求生命周期的正常流程。直接跳到LogRequest事件。如果要实现一个自定义错误处理程序模块,或者如果代码能够满足其自身的需求,而不需要其他模块或处理程序的帮助,那么可以使用此方法。

14.4.3 HttpRequest

HttpRequest对象用于描述所处理的HTTP请求。(使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。)下表列出了提供有关请求的信息的属性。

HttpRequest的作用是令到Asp.net能够读取客户端发送HTTP值。比如表单、URL、Cookie传递过来的参数。

  返回字符串的那些值就不说了,那些基本上都是与HTTP请求报文相关的东西。

   现在看看返回NameValueCollection对象的东东,这个对象只是为了存储返回的东西。

  1、Request.Headers;

  这个东西返回的是什么呢?写个实例:

       public ActionResult Index()
        {
            HttpRequest request = System.Web.HttpContext.Current.Request;
            NameValueCollection headersCollect = request.Headers;
            string[] headArr = headersCollect.AllKeys;
            foreach (string str in headArr)
            {
                Response.Write(str + ":" + headersCollect.Get(str) + ";<br/>");
            }
            return View();
        }

 看看在浏览器输出:

技术分享

  再用火狐看看HTTP请求报文的请求头信息:

技术分享

   明显可以看到,这个request.Headers返回的就是请求头信息的一个NameValueCollection集合。

   2、Request.Form

  这个属性获取的是浏览器提交的表单内容,也是返回NameValueCollection对象,这个对象中包含了所有的表单键值对内容。

  看前台HTML代码:

<form action="/Home/GetForm" method="post">
    <p>姓名:<input type="text" name="Name" /></p>  //输入张三
    <p>年龄:<input type="text" name="Age" /></p>   //输入12
    <p>性别:<input type="radio" name="male" value="man" />男 &nbsp; <input type="radio" name="male" value="woman" />女</p>  //选择 男
    <p><input type="submit" value="提交" /></p>
</form>

后台代码:

  public ActionResult GetForm()
        {
            HttpRequest request = System.Web.HttpContext.Current.Request;
            NameValueCollection FormCollect =  request.Form;
            foreach (string str in FormCollect)
            {
                Response.Write(str + ": " + FormCollect.Get(str) + "<br/>");
            }
            return Content("键值对数目:" + FormCollect.Count);
        }

 

浏览器输出:

Name: 张三
Age: 12
male: man
键值对数目:3

 3、Request.QueryString

  该属性的作用是将URL中的参数全部保存到NameValueCollection集合中。

 public ActionResult TestCookie()
        {
            NameValueCollection nvc = new NameValueCollection();
            nvc = System.Web.HttpContext.Current.Request.QueryString;
            Response.Write(nvc.Count + "   ");  //输出路径中参数集合的总数
            if (nvc.Count > 0)
            {
                foreach (string str in nvc.AllKeys)
                {
                    Response.Write(str + ": " + nvc.Get(str) + ";  ");      //遍历url参数集合,输出参数名与值
                }
            }
            return View();
            //当路径为http://localhost:22133/Home/testCookie?id=1&name=张三&Age=23
            //输出3 id: 1; name: 张三; Age: 28;      

4、Params,Item与QueryString、Forms的区别

  • Get请求用QueryString;
  • Post请求用Forms;
  • Parms与Item可以不区分Get请求还是Post请求;

  Params与Item两个属性唯一不同的是:Item是依次访问这4个集合,找到就返回结果,而Params是在访问时,先将4个集合的数据合并到一个新集合(集合不存在时创建), 然后再查找指定的结果。

 

13.4 上下文对象

标签:

原文地址:http://www.cnblogs.com/CandiceW/p/4958487.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!