处理程序
必须实现
IHttpHandler
IHttpAsyncHandler接口
定义
public interface IHttpHandler
{
void ProcessRequest(HttpContext context);
bool IsReusable{get;}//是否被缓冲,对应IHttpHandlerFactory使用
}
如果需要在处理程序中使用session则必须实现接口IRequiresSessionState接口
处理程序工厂IHttpHandlerFactory,HttpApplication有对它的引用
public interface IHttpHandlerFactory
{
IHttpHandler GetHandler{
HttpContext context,
string requestType,
string url,
string pathTranslated
};//获取处理对象
void ReleaseHandler{IhttpHandler handler};//释放
}
注册处理程序
那为什么需要注册呢?
因为有很多种不同的请求需要被处理
在system.web配置元素的子元素httpHandlers来配置
add
verb 通过一个逗号(,)分割的Http请求类型列表,例POST,GET,或者*代表全部
path 表示通过一个固定的URL路径或者一个使用星号(*)的通配符来匹配请求的URL,例如*.xu 代表处理所有后缀为xu的网页
type 处理程序的类型,格式为("命名空间.类名","程序集名称");
validate 如果设置为假,者在第一次匹配后,再不使用
remove
clear
对于一般的处理处理程序来说,是不需要进行配置得到,因为系统已经为我们注册了,下面看定义
<add
verb="*"
path="*.ashx"
type="System.web.UI.SimpleHandlerFactory"
validate=true
/>
从上面这个配置节就可以看出来,拓展名为ashx的处理程序是被SimpleHandlerFactory进行管理的
SimpleHandlerFactory找到对应的ashx文件
通过反射得到类的实例
通过GetHandler返回实例给HttpApplication
什么时候使用处理程序?
在方法结果不是HTML的时候
页面处理程序
<add
verb="*"
path="*.aspx"
type="System.web.UI.PageHandlerFactory"
validate=true
/>
PageHandlerFactory将寻找匹配请求名称的aspx文件,然后将这个模板文件进行解析,通过代码生成机制生成相应的页面类.
这个页面类派生自Page类
需要注意的是,aspx模板的解析和代码生成仅仅出现在第一次处理的时候
那么怎么创建的页面处理程序?
通过一个类 PageParser来进行生成
>GetCompiledPageInstance()
>BuildManager
>CrateInstanceFromVirtualPath()
MVC处理程序
处理过程
由一个处理程序通过一个控制器的工厂来取得实际的Controller(管理者)
然后请求被路由到Controller中,分配给对象的Action完成实际的处理工作
然后将处理的结果Modal传递给View
在ASP.NET MVC2下 这个MVC的路由中心可以在routes.MapRoute方法中进行指定
配置禁止访问的资源
<add
verb="*"
path="*.cs"
type="System.web.HttpForbiddenHandler"
validate=true
/>
Hold on, everything is possible.