首页 > 代码库 > 第二章--应用程序对象

第二章--应用程序对象

上下文对象HttpContext
  为了进一步简化服务器端对参数的处理工作,ASP.NET中定义了HttpContext类型来统一处理参数的表示问题
  底层方法:
    RewritePath 将服务器收到的请求URL替换为另一个指定的URL (可以做地址的映射)
    GetSection 获取配置文件中的配置节
    RemapHandler 重新设置当前的处理程序
应用程序对象 HttpApplication
  当HttpContext对象创建之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication
    HttpRuntime通过HttpApplictionFactory维护一个HttpApplication对象池,使得对象可以重复利用,但每个对象每次仅仅用于处理一个请求
    在HttpApplication中,利用.NET的事件机制,通过在处理过程中依次触发的多个事件,将这个处理过程分解为多个步骤,这个处理机制通常我们称为处理管道
管道
  就是处理复杂问题的时候,将处理的过程分解为多个处理步骤,我们将这种经过多个步骤的处理方式称为处理管道
  自定义处理管道:
    继承自System.ComponentModel.Component
      有一个Events集合管理

简单的例子:

  class Handler:Component
    {
        private static readonly object startEvent = new object();
        private static readonly object stopEvent = new object();


        public event EventHandler StartProcess
        {
            add { this.Events.AddHandler(startEvent, value); }
            remove { this.Events.RemoveHandler(startEvent, value); }
        }
        public event EventHandler StopProcess
        {
            add { this.Events.AddHandler(stopEvent, value); }
            remove { this.Events.RemoveHandler(stopEvent, value); }
        }
        protected void OnStartProcess(EventArgs e)
        {
            if (this.Events[startEvent]!=null)
            {
                ((EventHandler)this.Events[startEvent])(this, e);
            }
        }
        protected void OnStopProcess(EventArgs e)
        {
            if (this.Events[stopEvent] != null)
            {
                ((EventHandler)this.Events[stopEvent])(this, e);
            }
        }
         public void Process()
        {
            OnStartProcess(EventArgs.Empty);
            OnStopProcess(EventArgs.Empty);
        }
    }
        static void Main(string[] args)
        {
            Handler h = new Handler();
            h.StartProcess += h_StartProcess;
            h.StopProcess += h_StopProcess;
            h.Process();
            Console.Read();
        }

        static void h_StopProcess(object sender, EventArgs e)
        {
            Console.WriteLine("停止处理......");
        }
        static void h_StartProcess(object sender, EventArgs e)
        {
            Console.WriteLine("开始处理.....");
        }
    }

 

HttpApplication 的处理管道
  基本的步骤是这样
    BeginRequest 处理的开始
    验证身份
    授权
    是否有缓冲
      如果有就直接跳到最后
      否则获取处理这个请求的Handler
    得到处理程序后,还不能马上执行,因为还有可能有客户上次的遗留数据,需要加载
      PreRequestHandlerExecute 表示马上就要执行这个处理程序了
    执行完处理程序后,释放掉之前用到的数据,如果还需要将这次处理的结果缓存起来,以便
    在后续的请求中可以直接使用这个结果,UpdateRequestCache事件提供了处理的机会
    EndRequest 请求结束
HttpContext 状态管理
  因为HttpContext贯穿整个HttpApplication的处理过程中,所有可以使用Items属性来传递数据
处理HttpApplication的事件
  注册HttpApplication对象的事件处理
    1.IHttpModule
    2.global.asax
  在global.asax中可以注册一些通过特殊的命名规则定义的方法
    1.Application_HttpModule中的方法
    2.满足System.EventHandler
    3.必须为public
文件上传问题
  可以设置文件的最大长度(KB)默认是保存在内存中的....
    <httpRuntime maxRequestLength=" "/>
    如果是大文件的话,可以使用requestLengthDiskThreshold属性设置条件

第二章--应用程序对象