上下文对象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属性设置条件