现在的位置: 首页 > 综合 > 正文

ASP底层分析1

2013年10月22日 ⁄ 综合 ⁄ 共 2227字 ⁄ 字号 评论关闭

HttpApplication是如何处理请求的
  HttpApplication根据请求报文的url扩展名,来创建一个具体的处理程序。为了他让HttpApplication不与具体的处理程序耦合,可以考虑让所有处理程序都实现一个接口,如下:
  interface IHttpHandler{
    void ProcessRequest(HttpContext context);
  }
 
  HttpApplication:IHttpHandler{
    public void ProcessRequest(HttpContext context){
        IHttpHandler handler;//现在HttpApplicationIHttpHandler不再与具体的处理程序耦合了。
        handler.ProcessRequest(context);
    }
  }
 
  现在,让HttpApplication与一个IHttpHandler进行通信,因此我们将HttpApplication与具体的处理程序隔离开来了。可是现在的问题是,如何初始化IHttpHandler呢?
     我们可以考虑使用一个工厂,这个工厂将根据请求报文的URL扩展名来决定使用什么处理程序,如下:
     class HttpApplication{
        public void ProcessRequest(HttpContext context){
            HandlerFactory handlerFactory=new HandlerFactory(context.Request.Url.Extension);
            IHttpHandler handler=handlerFactory.GetHandler(context.Request.URL.AbsolutePath);
        }
     }
     
     class HandlerFactory{
        string _extension;
        puglic HandlerFactory(string extension){
            _extension=extension;
        }
        
        public void GetHandler(string absolutePath){
            switch(_extension){
                case "ashx":
                    return AshxHandler(absolutePath);
                    break;
                case "aspx"
                    return ASPXHandler(absolutePath);
                    break;
            }
        }
     }
 
  现在HttpApplication 就不再与任何具体的处理程序耦合了,因为HttpApplication把具体的工作交给了HandlerFactory,HandlerFactory会根据请求报文的url扩展名来创建相应的处理程序。
 
  仔细观察HandlerFactory的GetHandler会发现,他只能创建处理ashx和aspx扩展名的处理程序,如果将来出现了新的扩展名,那么就需要修改HttpHandler以创建一个新的处理程序,这毫无疑问会影响到HttpApplication,因为HttpApplication在使用HandlerFactory。
 
  为了隔离这种变化,我们修改HandlerFactory类,如下所示:
    class HandlerFactory{
        IHttpHandler GetHandler(String absolutePath){
            //根据扩展名,从配置文件读取处理程序的信息。
            HandlerInfo handlerInfo= ("c:\handler\register.config",_extension);
            //加载处理程序所在的程序集
            Assembly assem= Assembly.Load(handlerInfo.AssemblyName);
            //利用反射创建处理程序对象。
            return (IHttpHandler)assem.CreateInstance(handlerInfo.FullTypeName);
        }
    }
 
  现在,如果想要处理一个名为.globol的处理程序。只需要在c:\handler\register.config中写入如下信息即可:
  <extension=".globle",typeName="GlobleHandler",assembly="c:\handler\GlobleHandler">
  extension是要处理的url扩展名,typeName是处理程序的类型名,assembly是处理程序所在的程序集。
 
 
 OK,现在HttpApplication不仅可以可以处理ashx,aspx,还可以处理任何你指定的文件类型,前提是,你必须实现一个对象的处理程序,并在配置文件中注册。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

抱歉!评论已关闭.